Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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# 无法在Wpf画布上从右下角到左上角绘制矩形_C#_Wpf_Rectangles - Fatal编程技术网

C# 无法在Wpf画布上从右下角到左上角绘制矩形

C# 无法在Wpf画布上从右下角到左上角绘制矩形,c#,wpf,rectangles,C#,Wpf,Rectangles,我正在实现允许用户在运行时通过拖动鼠标在Wpf画布上绘制矩形的功能。当前,当我从左上角拖动鼠标到左下角时,我能够绘制矩形,但当我从左下角拖动鼠标到左上角时,矩形不可见。下面是我正在使用的xaml代码: <Canvas x:Name="CanvasContainer" MouseLeftButtonDown="CanvasContainer_MouseLeftButtonDown" MouseLeftButtonUp="CanvasContainer_MouseLeftButtonUp" M

我正在实现允许用户在运行时通过拖动鼠标在Wpf画布上绘制矩形的功能。当前,当我从左上角拖动鼠标到左下角时,我能够绘制矩形,但当我从左下角拖动鼠标到左上角时,矩形不可见。下面是我正在使用的xaml代码:

<Canvas x:Name="CanvasContainer" MouseLeftButtonDown="CanvasContainer_MouseLeftButtonDown" MouseLeftButtonUp="CanvasContainer_MouseLeftButtonUp" MouseMove="CanvasContainer_MouseMove" >
   <Rectangle  x:Name="RectangleMarker" Canvas.Left="0"  Stroke="Red" Width="0" Height="0" Panel.ZIndex="1"></Rectangle>
   <Line x:Name="LineMarker"  Stroke="Red" X1="0" Y1="0" X2="0" Y2="0"></Line>
   <Image Canvas.Left="0" Canvas.Top="0"  x:Name="PdfImage" RenderTransformOrigin="0.5,0.5" MouseWheel="PdfImage_MouseWheel"  ClipToBounds="True" Panel.ZIndex="0">
        <Image.LayoutTransform>
            <ScaleTransform ScaleX="1" ScaleY="1"  CenterX="0.5" CenterY="0.5"  />
        </Image.LayoutTransform>
    </Image>
</Canvas>

下面是根据鼠标位置更新矩形位置的事件处理

private void CanvasContainer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    try
    {          
            Point startPoint = Mouse.GetPosition(CanvasContainer);
            Canvas.SetLeft(RectangleMarker, startPoint.X);
            Canvas.SetTop(RectangleMarker,startPoint.Y);      
    }
    catch (Exception ex)
    {

    }
}

private void CanvasContainer_MouseMove(object sender, MouseEventArgs e)
{
    try
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {               
                Point endPoint = Mouse.GetPosition(CanvasContainer);
                Point startPoint = new Point((double)RectangleMarker.GetValue(Canvas.LeftProperty), (double)RectangleMarker.GetValue(Canvas.TopProperty));
                double x = Math.Min(startPoint.X, endPoint.X);
                double y = Math.Min(startPoint.Y, endPoint.Y);
                double width = endPoint.X - startPoint.X;
                double height = endPoint.Y - startPoint.Y;

                if (width < 0)
                {
                    x = startPoint.X + width;
                }
                if (height < 0)
                {
                    y = startPoint.Y + height;
                }
                RectangleMarker.Width = Math.Abs(width);
                RectangleMarker.Height = Math.Abs(height);
                if (x!=startPoint.X)
                {
                    Canvas.SetLeft(RectangleMarker, x);
                }
                else if(y!=startPoint.Y)
                {
                    Canvas.SetTop(RectangleMarker, y); 
                }                
        }          
    }
    catch (Exception ex)
    {

    }
}
private void canvasconner\u MouseLeftButtonDown(对象发送器,MouseButtonEventArgs e)
{
尝试
{          
Point startPoint=Mouse.GetPosition(CanvasContainer);
SetLeft(矩形标记,startPoint.X);
Canvas.SetTop(矩形标记,startPoint.Y);
}
捕获(例外情况除外)
{
}
}
私有void canvasconner\u MouseMove(对象发送方,MouseEventArgs e)
{
尝试
{
如果(e.LeftButton==鼠标按钮状态。按下)
{               
点端点=Mouse.GetPosition(CanvasContainer);
Point startPoint=新点((双精度)RectangleMarker.GetValue(Canvas.LeftProperty),(双精度)RectangleMarker.GetValue(Canvas.TopProperty));
double x=Math.Min(起点x,终点x);
双y=Math.Min(起点y,终点y);
双宽度=endPoint.X-startPoint.X;
双倍高度=endPoint.Y-startPoint.Y;
如果(宽度<0)
{
x=起点。x+宽度;
}
如果(高度<0)
{
y=起点。y+高度;
}
矩形标记.Width=Math.Abs(宽度);
矩形标记器.Height=Math.Abs(高度);
如果(x!=startPoint.x)
{
Canvas.SetLeft(矩形标记,x);
}
如果(y!=startPoint.y),则为else
{
Canvas.SetTop(矩形标记,y);
}                
}          
}
捕获(例外情况除外)
{
}
}

最好使用带有矩形几何体的路径:

<Canvas Background="Transparent"
        MouseLeftButtonDown="CanvasContainer_MouseLeftButtonDown"
        MouseLeftButtonUp="CanvasContainer_MouseLeftButtonUp"
        MouseMove="CanvasContainer_MouseMove">
    <Path Stroke="Red">
        <Path.Data>
            <RectangleGeometry x:Name="selectionRect"/>
        </Path.Data>
    </Path>
</Canvas>

最好使用带有矩形几何体的路径:

<Canvas Background="Transparent"
        MouseLeftButtonDown="CanvasContainer_MouseLeftButtonDown"
        MouseLeftButtonUp="CanvasContainer_MouseLeftButtonUp"
        MouseMove="CanvasContainer_MouseMove">
    <Path Stroke="Red">
        <Path.Data>
            <RectangleGeometry x:Name="selectionRect"/>
        </Path.Data>
    </Path>
</Canvas>

正如我前面在评论中提到的,您的问题不是绘图,而是调整大小

调整矩形大小时,有4个可能的方向、4条边和4个角。所以这有点复杂

最简单的方法是简单地记住开始鼠标位置,然后检查位置的位置,在它们之间绘制矩形。显然,新的鼠标位置可以是任意一个角,这取决于鼠标相对于起点的移动方向

因此:

Math.Abs
将处理正或负更改的大小调整,而对于更改位置,我们仍然需要进行条件检查,以确定左上角是起始点还是新鼠标

演示:


正如我前面在评论中提到的,您的问题不是绘图,而是调整大小

调整矩形大小时,有4个可能的方向、4条边和4个角。所以这有点复杂

最简单的方法是简单地记住开始鼠标位置,然后检查位置的位置,在它们之间绘制矩形。显然,新的鼠标位置可以是任意一个角,这取决于鼠标相对于起点的移动方向

因此:

Math.Abs
将处理正或负更改的大小调整,而对于更改位置,我们仍然需要进行条件检查,以确定左上角是起始点还是新鼠标

演示:


@Sinatr我不想画第二个矩形,只想移动现有的矩形。@Sinatr我的意思是像画图工具一样画矩形。按鼠标键并拖动以绘制矩形。如果向下对角线方向拖动(从UL到LR),则该矩形有效,但如果向上对角线方向拖动(从LR到UL),则该矩形不可见。@Sinatr我不想绘制第二个矩形,只想移动现有的矩形。@Sinatr我的意思是像绘制工具一样绘制矩形。按下鼠标按钮并拖动以绘制矩形。如果沿向下对角线方向(从UL到LR)拖动,则该矩形有效,但如果沿向上对角线方向(从LR到UL)拖动,则该矩形不可见。我唯一缺少的是存储起点。谢谢。“最简单的方法…”不完全正确。更简单的方法是从两点简单地创建一个Rect。无论每个点代表什么样的确切角点,都会正确地创建矩形(如我的回答所示)。@Clemens,这只是措辞而已。我喜欢你的解决方案。虽然我不知道如何让我的更容易。这样做的目的不是为了改变太多(至少是xaml)。我使用@Clemens解决方案,因为它需要较少的代码隐藏文件中的代码。但是你的解决方案也很有效。我唯一缺少的是存储起点。谢谢。“最简单的方法…”,不完全是。更简单的方法是从两点简单地创建一个Rect。无论每个点代表什么样的确切角点,都会正确地创建矩形(如我的回答所示)。@Clemens,这只是措辞而已。我喜欢你的解决方案。虽然我不知道如何让我的更容易。这样做的目的不是为了改变太多(至少是xaml)。我使用@Clemens解决方案,因为它需要较少的代码隐藏文件中的代码。但你的解决方案也有效。
Point _start;

void CanvasContainer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) =>
    _start = Mouse.GetPosition(CanvasContainer);

void CanvasContainer_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        var mouse = Mouse.GetPosition(CanvasContainer);
        Canvas.SetLeft(RectangleMarker, _start.X > mouse.X ? mouse.X : _start.X);
        Canvas.SetTop(RectangleMarker, _start.Y > mouse.Y ? mouse.Y : _start.Y);
        RectangleMarker.Width = Math.Abs(mouse.X - _start.X);
        RectangleMarker.Height = Math.Abs(mouse.Y - _start.Y);
    }
}