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;
        }