private void DragSource_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { try { Visual visual = e.OriginalSource as Visual; _topWindow = (Window)DragDropHelper.FindAncestor(typeof(Window), visual); _initialMousePosition = e.GetPosition(_topWindow); string adornerLayerName = GetAdornerLayer(sender as DependencyObject); _adornerLayer = (Canvas)_topWindow.FindName(adornerLayerName); string dropTargetName = GetDropTarget(sender as DependencyObject); _dropTarget = (UIElement)_topWindow.FindName(dropTargetName); _draggedData = (sender as FrameworkElement).DataContext; } catch (Exception exc) { Console.WriteLine("Exception in DragDropHelper: " + exc.InnerException.ToString()); } }
// Drag = mouse down + move by a certain amount private void DragSource_PreviewMouseMove(object sender, MouseEventArgs e) { if (!_mouseCaptured && _draggedData != null) { // Only drag when user moved the mouse by a reasonable amount. if (DragDropHelper.IsMovementBigEnough(_initialMousePosition, e.GetPosition(_topWindow))) { _adorner = (DragDropAdornerBase)GetDragDropControl(sender as DependencyObject); _adorner.DataContext = _draggedData; _adorner.Opacity = 0.7; _adornerLayer.Visibility = Visibility.Visible; _adornerLayer.Children.Add(_adorner); _mouseCaptured = Mouse.Capture(_adorner); Canvas.SetLeft(_adorner, _initialMousePosition.X - 20); Canvas.SetTop(_adorner, _initialMousePosition.Y - 15); _adornerLayer.PreviewMouseMove += new MouseEventHandler(_adorner_MouseMove); _adornerLayer.PreviewMouseUp += new MouseButtonEventHandler(_adorner_MouseUp); } } }