Неверный прямоугольник, нарисованный на холсте при увеличении - PullRequest
0 голосов
/ 20 октября 2019

Добрый день. Я пытался создать программу, которую пользователь может увеличивать и рисовать. используя WPF

К счастью, я нашел класс панорамирования и масштабирования

Pan & Zoom Image

И я использую ZoomBorder.cs из вопроса.

И я хочу иметь возможность использовать MVVM. Поэтому я добавил свойство зависимости в ZoomBorder.cs

public RectItem RectSize
        {
            get { return (RectItem)GetValue(RectSizeProperty); }
            set { SetValue(RectSizeProperty, value); }
        }

        // Using a DependencyProperty as the backing store for RectSize.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RectSizeProperty =
            DependencyProperty.Register("RectSize", typeof(RectItem), typeof(ZoomBorder),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null));

, которое возвращает модель

public class RectItem : BindableBase
    {
        private double _X;

        public double X
        {
            get { return _X; }
            set { SetProperty(ref _X, value); }
        }

        private double _Y;

        public double Y
        {
            get { return _Y; }
            set { SetProperty(ref _Y, value); }
        }

        private double _Width;

        public double Width
        {
            get { return _Width; }
            set { SetProperty(ref _Width, value); }
        }

        private double _Height;

        public double Height
        {
            get { return _Height; }
            set { SetProperty(ref _Height, value); }
        }

    }

А вот код для рисования

private void child_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {

                startPoint = Mouse.GetPosition((IInputElement)sender);

        }


private void child_MouseMove(object sender, MouseEventArgs e)
        {

                if (e.LeftButton == MouseButtonState.Released)
                    return;


                var pos = Mouse.GetPosition((IInputElement)sender);

                // Set the position of rectangle
                var x = Math.Min(pos.X, startPoint.X);
                var y = Math.Min(pos.Y, startPoint.Y);

                // Set the dimenssion of the rectangle
                var w = Math.Max(pos.X, startPoint.X) - x;
                var h = Math.Max(pos.Y, startPoint.Y) - y;

                var r = new RectItem();

                r.X = x;
                r.Y = y;
                r.Width = w;
                r.Height = h;

                RectSize = r;

        }

Итакдалеко нарисованный прямоугольник правильный. Он рисует прямоугольник в положении мыши

enter image description here

Но когда я увеличил масштаб. Координаты неверны. Прямоугольник не рисуется в положении мыши. Он рисует в нижней части мыши. Так как я могу исправить эту проблему? Спасибо

...