void Canvas_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { var canvas = sender as Canvas; if (canvas != null && canvas == m_canvas && m_rect != null) { m_hitType = Canvas_GetHitType(m_rect, Mouse.GetPosition(m_canvas)); var desiredCursor = Canvas_GetMouseCursor(m_hitType); if (Cursor != desiredCursor) Cursor = desiredCursor; if (m_hitType == RectangleHitType.None) return; m_lastPoint = Mouse.GetPosition(m_canvas); m_dragInProgress = true; } }
private void Canvas_MouseMove(object sender, MouseEventArgs e) { var canvas = sender as Canvas; if (canvas != null && canvas == m_canvas && m_dragInProgress && m_rect != null) { // See how much the mouse has moved Point point = Mouse.GetPosition(m_canvas); double offset_x = point.X - m_lastPoint.X; double offset_y = point.Y - m_lastPoint.Y; // Get the rectangle's current position double new_x = Canvas.GetLeft(m_rect); double new_y = Canvas.GetTop(m_rect); double new_width = m_rect.Width; double new_height = m_rect.Height; // Update the rectangle switch (m_hitType) { case RectangleHitType.Body: new_x += offset_x; new_y += offset_y; break; case RectangleHitType.Top: new_y += offset_y; new_height -= offset_y; break; case RectangleHitType.UpperRight: new_y += offset_y; new_width += offset_x; new_height -= offset_y; break; case RectangleHitType.Right: new_width += offset_x; break; case RectangleHitType.LowerRight: new_width += offset_x; new_height += offset_y; break; case RectangleHitType.Bottom: new_height += offset_y; break; case RectangleHitType.LowerLeft: new_x += offset_x; new_width -= offset_x; new_height += offset_y; break; case RectangleHitType.Left: new_x += offset_x; new_width -= offset_x; break; case RectangleHitType.UpperLeft: new_x += offset_x; new_y += offset_y; new_width -= offset_x; new_height -= offset_y; break; } // Don't use negative width or height if ((new_width > 0) && (new_height > 0)) { // Update the rectangle Canvas.SetLeft(m_rect, new_x); Canvas.SetTop(m_rect, new_y); m_rect.Width = new_width; m_rect.Height = new_height; // Save the mouse's new location m_lastPoint = point; } } else { m_hitType = Canvas_GetHitType(m_rect, Mouse.GetPosition(m_canvas)); var desiredCursor = Canvas_GetMouseCursor(m_hitType); if (Cursor != desiredCursor) Cursor = desiredCursor; } }
private Cursor Canvas_GetMouseCursor(RectangleHitType hitType) { Cursor desiredCursor = Cursors.Arrow; switch (hitType) { case RectangleHitType.None: desiredCursor = Cursors.Arrow; break; case RectangleHitType.Body: desiredCursor = Cursors.ScrollAll; break; case RectangleHitType.Top: case RectangleHitType.Bottom: desiredCursor = Cursors.SizeNS; break; case RectangleHitType.LowerLeft: case RectangleHitType.UpperRight: desiredCursor = Cursors.SizeNESW; break; case RectangleHitType.Left: case RectangleHitType.Right: desiredCursor = Cursors.SizeWE; break; case RectangleHitType.UpperLeft: case RectangleHitType.LowerRight: desiredCursor = Cursors.SizeNWSE; break; } return desiredCursor; }