private void UpdateSnapLine(SnapLinePositions positions, FrameworkElement elem) { double?x = null; double?y = null; if ((positions & SnapLinePositions.Top) == SnapLinePositions.Top) { y = Canvas.GetTop(elem); } if ((positions & SnapLinePositions.Bottom) == SnapLinePositions.Bottom) { y = Canvas.GetTop(elem) + elem.ActualHeight; } if ((positions & SnapLinePositions.Left) == SnapLinePositions.Left) { x = Canvas.GetLeft(elem); } if ((positions & SnapLinePositions.Right) == SnapLinePositions.Right) { x = Canvas.GetLeft(elem) + elem.ActualWidth; } if (x.HasValue && y.HasValue) { lineX.X1 = lineX.X2 = x.Value; lineY.Y1 = lineY.Y2 = y.Value; } }
private void Window_MouseMove_1(object sender, MouseEventArgs e) { if (_isMousePressed) { Point p = e.GetPosition(mainCanvas); // Use the system parameters to determine when to flag dragging if (!_isMouseDragging && ((Math.Abs(p.X - _originalMousePosition.X) > SystemParameters.MinimumHorizontalDragDistance) || (Math.Abs(p.Y - _originalMousePosition.Y) > SystemParameters.MinimumVerticalDragDistance))) { _isMouseDragging = true; } if (_isMouseDragging) { Point point = new Point((int)(p.X - (_originalMousePosition.X - _originalElementPosition.X)), (int)(p.Y - (_originalMousePosition.Y - _originalElementPosition.Y))); bool controlDown = (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)); bool shiftDown = (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift)); SnapLinePositions snapLines = (SnapLinePositions.Top | SnapLinePositions.Left); if (controlDown && shiftDown) { var left = point.X; var top = point.Y; var bottom = (top + _selection.ActualHeight); var right = (left + _selection.ActualWidth); var moveLeft = left; var moveTop = top; foreach (ItemControl item in _items) { if (item.IsVisible && item != _selection) { var itemLeft = Canvas.GetLeft(item); var itemTop = Canvas.GetTop(item); var itemBottom = (itemTop + item.ActualHeight); var itemRight = (itemLeft + item.ActualWidth); #region Opposite Sides // Left/Right if (Math.Abs(left - itemRight) < 10) { snapLines &= ~SnapLinePositions.Right; snapLines |= SnapLinePositions.Left; moveLeft = itemRight; } // Right/Left if (Math.Abs(right - itemLeft) < 10) { snapLines &= ~SnapLinePositions.Left; snapLines |= SnapLinePositions.Right; moveLeft = (itemLeft - _selection.ActualWidth); } // Bottom/Top if (Math.Abs(bottom - itemTop) < 10) { snapLines &= ~SnapLinePositions.Top; snapLines |= SnapLinePositions.Bottom; moveTop = (itemTop - _selection.ActualHeight); } // Top/Bottom if (Math.Abs(top - itemBottom) < 10) { snapLines &= ~SnapLinePositions.Bottom; snapLines |= SnapLinePositions.Top; moveTop = itemBottom; } #endregion #region Same Sides // Right/Right if (Math.Abs(itemRight - right) < 10) { snapLines &= ~SnapLinePositions.Left; snapLines |= SnapLinePositions.Right; moveLeft = (itemRight - _selection.ActualWidth); } // Left/Left if (Math.Abs(itemLeft - point.X) < 10) { snapLines &= ~SnapLinePositions.Right; snapLines |= SnapLinePositions.Left; moveLeft = itemLeft; } // Bottom/Bottom if (Math.Abs(itemBottom - bottom) < 10) { snapLines &= ~SnapLinePositions.Top; snapLines |= SnapLinePositions.Bottom; moveTop = (itemBottom - _selection.ActualHeight); } // Top/Top if (Math.Abs(itemTop - top) < 10) { snapLines &= ~SnapLinePositions.Bottom; snapLines |= SnapLinePositions.Top; moveTop = itemTop; } #endregion } } point = new Point(moveLeft, moveTop); } else { if (Settings.Snap.Enabled) { point = Helper.SnapPoint(point, _selection.ActualWidth); } } ShowSnapLine(); UpdateSnapLine(snapLines, _selection); Canvas.SetLeft(_selection, Helper.BoundX(point.X, _selection)); Canvas.SetTop(_selection, Helper.BoundY(point.Y, _selection)); UpdateTitle(); } } }