コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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();
                }
            }
        }