private static void DragSourceOnMouseMove(object sender, MouseEventArgs e) { var dragInfo = m_DragInfo; if (dragInfo != null && !m_DragInProgress) { // the start from the source var dragStart = dragInfo.DragStartPosition; // do nothing if mouse left/right button is released or the pointer is captured if (dragInfo.MouseButton == MouseButton.Left && e.LeftButton == MouseButtonState.Released) { m_DragInfo = null; return; } if (DragDrop.GetCanDragWithMouseRightButton(dragInfo.VisualSource) && dragInfo.MouseButton == MouseButton.Right && e.RightButton == MouseButtonState.Released) { m_DragInfo = null; return; } // current mouse position var position = e.GetPosition((IInputElement)sender); // prevent selection changing while drag operation dragInfo.VisualSource?.ReleaseMouseCapture(); // only if the sender is the source control and the mouse point differs from an offset if (dragInfo.VisualSource == sender && (Math.Abs(position.X - dragStart.X) > DragDrop.GetMinimumHorizontalDragDistance(dragInfo.VisualSource) || Math.Abs(position.Y - dragStart.Y) > DragDrop.GetMinimumVerticalDragDistance(dragInfo.VisualSource))) { dragInfo.RefreshSelectedItems(sender, e); var dragHandler = TryGetDragHandler(dragInfo, sender as UIElement); if (dragHandler.CanStartDrag(dragInfo)) { dragHandler.StartDrag(dragInfo); if (dragInfo.Effects != DragDropEffects.None) { var dataObject = dragInfo.DataObject; if (dataObject == null) { if (dragInfo.Data == null) { // it's bad if the Data is null, cause the DataObject constructor will raise an ArgumentNullException m_DragInfo = null; // maybe not necessary or should not set here to null return; } dataObject = new DataObject(dragInfo.DataFormat.Name, dragInfo.Data); } try { m_DragInProgress = true; CreateHintAdorners(sender, dragInfo); var dragDropHandler = dragInfo.DragDropHandler ?? System.Windows.DragDrop.DoDragDrop; var dragDropEffects = dragDropHandler(dragInfo.VisualSource, dataObject, dragInfo.Effects); if (dragDropEffects == DragDropEffects.None) { dragHandler.DragCancelled(); } dragHandler.DragDropOperationFinished(dragDropEffects, dragInfo); DestroyHintAdorners(); } catch (Exception ex) { if (!dragHandler.TryCatchOccurredException(ex)) { throw; } } finally { m_DragInProgress = false; m_DragInfo = null; } } } } } }
private static void DragSourceOnMouseMove(object sender, MouseEventArgs e) { if (m_DragInfo != null && !m_DragInProgress) { // the start from the source var dragStart = m_DragInfo.DragStartPosition; // do nothing if mouse left/right button is released or the pointer is captured if (m_DragInfo.MouseButton == MouseButton.Left && e.LeftButton == MouseButtonState.Released) { m_DragInfo = null; return; } if (DragDrop.GetCanDragWithMouseRightButton(m_DragInfo.VisualSource) && m_DragInfo.MouseButton == MouseButton.Right && e.RightButton == MouseButtonState.Released) { m_DragInfo = null; return; } // current mouse position var position = e.GetPosition((IInputElement)sender); // prevent selection changing while drag operation m_DragInfo.VisualSource?.ReleaseMouseCapture(); // only if the sender is the source control and the mouse point differs from an offset if (m_DragInfo.VisualSource == sender && (Math.Abs(position.X - dragStart.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(position.Y - dragStart.Y) > SystemParameters.MinimumVerticalDragDistance)) { var dragHandler = TryGetDragHandler(m_DragInfo, sender as UIElement); if (dragHandler.CanStartDrag(m_DragInfo)) { dragHandler.StartDrag(m_DragInfo); if (m_DragInfo.Effects != DragDropEffects.None && m_DragInfo.Data != null) { var data = m_DragInfo.DataObject; if (data == null) { data = new DataObject(DataFormat.Name, m_DragInfo.Data); } else { data.SetData(DataFormat.Name, m_DragInfo.Data); } try { m_DragInProgress = true; var result = System.Windows.DragDrop.DoDragDrop(m_DragInfo.VisualSource, data, m_DragInfo.Effects); if (result == DragDropEffects.None) { dragHandler.DragCancelled(); } } catch (Exception ex) { if (!dragHandler.TryCatchOccurredException(ex)) { throw; } } finally { m_DragInProgress = false; } m_DragInfo = null; } } } } }