void host_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //  Perform a hist test.
            HitTest hitTest = new HitTest();

            hitTest.DoHitTest(host, e.GetPosition(host));

            //  Go through the hits, looking for a draggable object.
            foreach (var hit in hitTest.Hits)
            {
                //  Is this a draggable object?
                FrameworkElement foundDragElement, foundDragSource;
                if (hit is FrameworkElement &&
                    IsInDraggableElement((FrameworkElement)hit, out foundDragElement, out foundDragSource))
                {
                    //  We've found an object to drag - store its data.
                    dragElement          = foundDragElement;
                    dragData             = dragElement.DataContext;
                    dragSource           = foundDragSource;
                    initialMousePosition = e.GetPosition(host);
                    initialElementOffset = e.GetPosition(dragElement);

                    break;
                }
            }
        }
        void host_MouseMove(object sender, MouseEventArgs e)
        {
            //  We only care about mouse moves if we have a drag element.
            if (dragElement == null)
            {
                return;
            }

            //  Update the current mouse position.
            currentMousePosition = e.GetPosition(host);

            //  We have a drag element - are we dragging?
            if (dragging == false)
            {
                //  We're not - have we moved enough to start a drag?
                //  Apex.Consistency.SystemParamters returns drag distances
                //  as SystemParameters doesn't have it in silverlight.
                if (
                    (Math.Abs(initialMousePosition.X - currentMousePosition.X) >=
                     MinimumHorizontalDragDistance) &&
                    (Math.Abs(initialMousePosition.Y - currentMousePosition.Y) >=
                     MinimumHorizontalDragDistance))
                {
                    //  We'll try starting a drag and drop.
                    DoDragAndDropStart(dragSource, dragElement, dragData);
                    if (dragging)
                    {
                        host.CaptureMouse();
                    }
                }
            }

            //  If we're still not dragging, we're done.
            if (dragging == false)
            {
                return;
            }

            //  If we have an adorner, move it.
            if (dragAdorner != null)
            {
                dragAdorner.Translation.X = currentMousePosition.X - initialElementOffset.X;
                dragAdorner.Translation.Y = currentMousePosition.Y - initialElementOffset.Y;
            }

            //  Are we over a drop target?
            FrameworkElement dropTargetOver = null;

            //  Perform a hist test.
            HitTest hitTest = new HitTest();

            hitTest.DoHitTest(host, e.GetPosition(host));

            foreach (var dt in hitTest.Hits)
            {
                FrameworkElement foundDropTarget;
                if (dt is FrameworkElement &&
                    IsInDropTarget((FrameworkElement)dt, out foundDropTarget))
                {
                    dropTargetOver = foundDropTarget;
                    break;
                }
            }

            //  If we are not over a drop target, clear the drop over.
            if (dropTargetOver == null)
            {
                dropTarget = null;
                return;
            }

            //  If we are over a drop target and it's a new one, check
            //  for continuing.
            if (dropTargetOver != dropTarget)
            {
                DoContinueDragAndDrop(dropTargetOver);
            }
        }