Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的矩形绘图坐标有什么问题?_C#_.net_Wpf_Wpf 4.0_Wpf Graphics - Fatal编程技术网

C# 我的矩形绘图坐标有什么问题?

C# 我的矩形绘图坐标有什么问题?,c#,.net,wpf,wpf-4.0,wpf-graphics,C#,.net,Wpf,Wpf 4.0,Wpf Graphics,我试图使用下面的代码来允许用户在屏幕上的某个东西周围画一个矩形,以选择该区域 public partial class MainWindow : Window { public enum DrawMode { Move, Draw } private DrawMode _drawmode; private Point _startPoint; private Rectangle _rectangle; pu

我试图使用下面的代码来允许用户在屏幕上的某个东西周围画一个矩形,以选择该区域

public partial class MainWindow : Window
{
    public enum DrawMode
    {
        Move,
        Draw
    }

    private DrawMode _drawmode;
    private Point _startPoint;
    private Rectangle _rectangle;
    public MainWindow()
    {
        _rectangle = new Rectangle();
        _rectangle.Stroke = new SolidColorBrush(Colors.Black);
        _rectangle.StrokeThickness = 1;
        InitializeComponent();
    }

    private void MapImageOnMouseDown(object sender, MouseButtonEventArgs e)
    {
        _drawmode = DrawMode.Draw;
        _startPoint = e.GetPosition(DrawCanvas);
    }

    private void MapImageOnMouseUp(object sender, MouseButtonEventArgs e)
    {
        _drawmode = DrawMode.Move;
    }

    private void MapImageOnMouseMove(object sender, MouseEventArgs e)
    {
        if (_drawmode == DrawMode.Draw)
        {
            DrawCanvas.Children.Remove(_rectangle);
            var endPoint = e.GetPosition(DrawCanvas);
            var width = Math.Abs(endPoint.X - _startPoint.X);
            var height = Math.Abs(endPoint.Y - _startPoint.Y);
            _rectangle.Width = width;
            _rectangle.Height = height;
            DrawCanvas.Children.Add(_rectangle);
            Canvas.SetTop(_rectangle, _startPoint.X);
            Canvas.SetLeft(_rectangle, _startPoint.Y);
        }
    }
}
但是,当我鼠标向下移动时,矩形的左上角离我鼠标向下移动的点很远。有不同的坐标系吗

    Point startPoint = new Point(0, 0);
    Point endPoint = new Point(1, 1);
    bool mousePress = false;
    control.MouseDown += (s, e) =>
    {
            startPoint = new Point(e.X,e.Y);
            mousePress = true;
    };
    control.MouseUp += (s, e) =>
    {
            mousePress = false;
    };
    control.MouseMove += (s, e) =>
    {
            if (mousePress)
            {
                endPoint = new Point(e.X, e.Y);
                control.Invalidate();
            }
    };
    control.Paint += (s, e) =>
    {
            Graphics g = e.Graphics;
            g.DrawRectangle(Pens.Black, new Rectangle(startPoint.X, startPoint.Y,endPoint.X-startPoint.X, endPoint.Y-startPoint.Y));
    };

我过去一直在画画,这对我来说对矩形很有用,不知道它是如何翻译成wpf的,因为你把
X
Y
(或者
)。改变


也不必在矩形位置每次更改时删除和添加矩形:

public MainWindow()
{
    InitializeComponent();

    _rectangle = new Rectangle
    {
        Stroke = Brushes.Black,
        StrokeThickness = 1
    };

    DrawCanvas.Children.Add(_rectangle); // add it once
}

private void MapImageOnMouseMove(object sender, MouseEventArgs e)
{
    if (_drawmode == DrawMode.Draw)
    {
        var endPoint = e.GetPosition(DrawCanvas);
        _rectangle.Width = Math.Abs(endPoint.X - _startPoint.X);
        _rectangle.Height = Math.Abs(endPoint.Y - _startPoint.Y);
        Canvas.SetLeft(_rectangle, Math.Min(_startPoint.X, endPoint.X));
        Canvas.SetTop(_rectangle, Math.Min(_startPoint.Y, endPoint.Y));
    }
}

什么是
控件
?我的
Canvas
?您正在绘制的控件在WinForms中运行良好,将在WPF中尝试它-它比我的更简单。不过,我认为大多数矩形绘制代码都存在一个挥之不去的问题,即它只会向右和向下绘制。您不能向左和向上绘制。不幸的是,WPF中的
画布
绘制表面没有
绘制
事件,我发现没有类似的外观,但谢谢,当我找到等价物时,我会将此标记为书签。
Canvas.SetLeft(_rectangle, _startPoint.X);
Canvas.SetTop(_rectangle, _startPoint.Y);
public MainWindow()
{
    InitializeComponent();

    _rectangle = new Rectangle
    {
        Stroke = Brushes.Black,
        StrokeThickness = 1
    };

    DrawCanvas.Children.Add(_rectangle); // add it once
}

private void MapImageOnMouseMove(object sender, MouseEventArgs e)
{
    if (_drawmode == DrawMode.Draw)
    {
        var endPoint = e.GetPosition(DrawCanvas);
        _rectangle.Width = Math.Abs(endPoint.X - _startPoint.X);
        _rectangle.Height = Math.Abs(endPoint.Y - _startPoint.Y);
        Canvas.SetLeft(_rectangle, Math.Min(_startPoint.X, endPoint.X));
        Canvas.SetTop(_rectangle, Math.Min(_startPoint.Y, endPoint.Y));
    }
}