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); } }