private static void SetResizingMouseCursor(ResizeClickPosition clickPos) { Cursor newCursor = null; switch (clickPos) { case ResizeClickPosition.Left: case ResizeClickPosition.Right: newCursor = Cursors.SizeWE; break; case ResizeClickPosition.Top: case ResizeClickPosition.Bottom: newCursor = Cursors.SizeNS; break; case ResizeClickPosition.LeftTop: case ResizeClickPosition.RightBottom: newCursor = Cursors.SizeNWSE; break; case ResizeClickPosition.RightTop: case ResizeClickPosition.LeftBottom: newCursor = Cursors.SizeNESW; break; } if (Mouse.OverrideCursor != newCursor) { Mouse.OverrideCursor = newCursor; } }
/// <summary> /// Start dragging /// </summary> /// <param name="e"></param> protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e) { if (_isBeingDragged) { return; } base.OnPreviewMouseLeftButtonDown(e); if (_selectedElement == null) { return; } _dragStartCursorPos = e.GetPosition(this); double x = GetLeft(_selectedElement); double y = GetTop(_selectedElement); switch (Mode) { case DragMode.Move: _dragStartElementPos = new Point(x, y); SetMovingMouseCursor(); break; case DragMode.Resize: _dragStartElementRect = new Rect(x, y, _selectedElement.Width, _selectedElement.Height); _resizeClickPos = DetectResizeClickPosition(_dragStartCursorPos, _dragStartElementRect); SetResizingMouseCursor(_resizeClickPos); break; } _selectedElement.CaptureMouse(); _isBeingDragged = true; e.Handled = true; }
private static Rect CalcNewSize(Point cursorStart, Point cursorNow, Rect elementRect, ResizeClickPosition clickPos) { const int MinLineLen = 16; // Do not touch Width and Height if border was not clicked switch (clickPos) { case ResizeClickPosition.Inside: case ResizeClickPosition.Outside: return(elementRect); } // Get delta of X and Y double xDelta = cursorNow.X - cursorStart.X; double yDelta = cursorNow.Y - cursorStart.Y; // Prepare variables double x = elementRect.X; double y = elementRect.Y; double width = elementRect.Width; double height = elementRect.Height; // X Direction switch (clickPos) { case ResizeClickPosition.Left: case ResizeClickPosition.LeftTop: case ResizeClickPosition.LeftBottom: if (Math.Abs(xDelta) < double.Epsilon) { break; } if (0 < xDelta) { // L [-> ] R, delta is positive if (xDelta + MinLineLen < width) { x += xDelta; width -= xDelta; } else { // Guard x += width - MinLineLen; width = MinLineLen; } } else { // L <-[ ] R, delta is negative x += xDelta; width -= xDelta; } break; case ResizeClickPosition.Right: case ResizeClickPosition.RightTop: case ResizeClickPosition.RightBottom: if (Math.Abs(xDelta) < double.Epsilon) { break; } if (0 < xDelta) { // L [ ]-> R, delta is positive width += xDelta; } else { // L [ <-] R, delta is negative if (MinLineLen < width + xDelta) // Guard { width += xDelta; } else { width = MinLineLen; } } break; } // Y Direction switch (clickPos) { case ResizeClickPosition.Top: case ResizeClickPosition.LeftTop: case ResizeClickPosition.RightTop: if (Math.Abs(yDelta) < double.Epsilon) { break; } if (0 < yDelta) { // T [-> ] B, delta is positive if (yDelta + MinLineLen < height) { y += yDelta; height -= yDelta; } else { // Guard y += height - MinLineLen; height = MinLineLen; } } else { // T <-[ ] B, delta is negative y += yDelta; height -= yDelta; } break; case ResizeClickPosition.Bottom: case ResizeClickPosition.LeftBottom: case ResizeClickPosition.RightBottom: if (Math.Abs(yDelta) < double.Epsilon) { break; } if (0 < yDelta) { // T [ ]-> B, delta is positive height += yDelta; } else { // T [ <-] B, delta is negative if (MinLineLen < height + yDelta) // Guard { height += yDelta; } else { height = MinLineLen; } } break; } // Check if X and Width is correct switch (clickPos) { case ResizeClickPosition.Left: case ResizeClickPosition.LeftTop: case ResizeClickPosition.LeftBottom: if (x < 0) { width += x; x = 0; } break; case ResizeClickPosition.Right: case ResizeClickPosition.RightTop: case ResizeClickPosition.RightBottom: if (CanvasWidthHeightLimit + ElementWidthHeightLimit < x + width) { width = CanvasWidthHeightLimit + ElementWidthHeightLimit - x; } break; } // Check if Y and Height is correct switch (clickPos) { case ResizeClickPosition.Top: case ResizeClickPosition.LeftTop: case ResizeClickPosition.RightTop: if (y < 0) { height += y; y = 0; } break; case ResizeClickPosition.Bottom: case ResizeClickPosition.LeftBottom: case ResizeClickPosition.RightBottom: if (CanvasWidthHeightLimit + ElementWidthHeightLimit < y + height) { height = CanvasWidthHeightLimit + ElementWidthHeightLimit - y; } break; } return(new Rect(x, y, width, height)); }