/// <summary> /// Trigger a dragging event when the user moves the mouse while the left mouse button is pressed /// </summary> protected override void OnMouseMove(MouseEventArgs e) { if (_userClickedThisElement && !_dragActive) { _dragActive = true; DragStart?.Invoke(this, e); } if (_dragActive) { Point curMouseScreenPos = e.GetPosition(this); if (!curMouseScreenPos.Equals(_previousMouseScreenPos)) { double xDelta = curMouseScreenPos.X - _previousMouseScreenPos.X; double yDelta = curMouseScreenPos.Y - _previousMouseScreenPos.Y; var dragEvent = new DragMoveEventArgs(e, xDelta, yDelta); DragMove?.Invoke(this, dragEvent); ApplyDragToChildren(dragEvent); _previousMouseScreenPos = curMouseScreenPos; } } base.OnMouseMove(e); }
private void ApplyDragToChildren(DragMoveEventArgs drag) { foreach (UIElement cur in Children) { double prevLeft = Canvas.GetLeft(cur); if (Double.IsNaN(prevLeft)) { prevLeft = 0; } double prevTop = Canvas.GetTop(cur); if (Double.IsNaN(prevTop)) { prevTop = 0; } Canvas.SetLeft(cur, prevLeft + (drag.DeltaX)); Canvas.SetTop(cur, prevTop + (drag.DeltaY)); } }