Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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 DrawingVisual中的DrawingVisual跟踪方案_C#_Wpf_Pathgeometry_Drawingvisual - Fatal编程技术网

C# WPF DrawingVisual中的DrawingVisual跟踪方案

C# WPF DrawingVisual中的DrawingVisual跟踪方案,c#,wpf,pathgeometry,drawingvisual,C#,Wpf,Pathgeometry,Drawingvisual,我正在WPF中创建一个CAD程序,它可以添加和删除线和矩形,这两个都由PathGeometry描述。当我进一步了解这个程序时,它将包含大量不同的路径几何体,每个路径几何体都构成了单个DrawingVisuals的属性。出于性能原因,我使用VisualClass 由于每个DrawingVisual实际上是相同的,因为它只是由PathGeometry组成的DrawingVisual,所以它没有唯一的标识符。我需要某种类型的标识符,这样当我右键单击直线或矩形时,我可以在其上绘制一些句柄,使其可以使用鼠

我正在WPF中创建一个CAD程序,它可以添加和删除线和矩形,这两个都由PathGeometry描述。当我进一步了解这个程序时,它将包含大量不同的路径几何体,每个路径几何体都构成了单个DrawingVisuals的属性。出于性能原因,我使用VisualClass

由于每个DrawingVisual实际上是相同的,因为它只是由PathGeometry组成的DrawingVisual,所以它没有唯一的标识符。我需要某种类型的标识符,这样当我右键单击直线或矩形时,我可以在其上绘制一些句柄,使其可以使用鼠标进行修改。(我希望线条的端点是可移动的,矩形是可拉伸的,等等)在线条、贝塞尔曲线等的控制柄线条上有一些例子,但它们没有处理不同类型的问题

在下面的代码中,就像我的代码一样,单击鼠标检索drawingVisual对象。但是,由于drawingVisuals没有任何特殊功能,比如“这是一个矩形”或“这是一条线”,因此我需要找到一种从HitTestResult中获取信息的方法。知道了这一点,当我想修改它时,我可以决定如何处理它。一条直线将有2个控制点,一个矩形将有4个,我的其他一些几何图形(尚未制作)将有6个或更多的控制值

当我在调试模式下进入visualTree(通过Debug>Window访问)时,它只显示“DrawingVisual”。这还不足以让我们知道如何将其视为直线或矩形

因此,在大型假发CAD程序中,它们允许您修改单击的对象。这个软件有一些方法可以知道你点击了什么,我想在我的初级CAD程序中有这个功能

我尝试使用调试功能并查找某种唯一标识符,但找不到。我曾考虑过使用一个列表并在创建每个项目时给出它,但我无法将其与HitTestResult链接

这是可以做到的,所以这不是一个问题,但我需要一个方案来模拟CAD程序如何实现这一功能

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);

    HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt);

    if (result != null)
    {
        // Perform action on hit visual object.
    }
}
如果你能帮我告诉我怎么做,我将不胜感激。基本上,高功能CAD程序用于跟踪鼠标点击的视觉类型的方案是什么


TYIA

检查DrawingVisual的属性。应该有一个几何图形与您的几何图形。也就是说,在这里使用视觉效果似乎过于复杂。我相信你也可以使用路径元素。我可以提取几何图形,但这有什么帮助?我仍然不知道我是在一个矩形还是一条直线上。我应该解析它还是什么,这会告诉我吗?比如,如果线条几何体的长度为20字节,而矩形为40字节?如果两种类型的字节数相同,我可能会遇到问题,(这显然不适用于Line或Rect,但在添加其他设计时适用于其他几何体。太糟糕了,没有办法进入DrawingVisual代码并向其添加属性。例如Visual.Line或Visual.Rect。然后,您当然会检查GeometryDrawing的
Geometry
属性是否包含矩形几何体或矩形几何体。)其他操作(使用
is
as
操作符)说真的,你应该考虑一个更简单的方法。好的,我选择了视觉的速度。很多东西在屏幕上都会被移动。当它全部完成的时候,它会像一幅动画画。一切都是一个路径几何学的核心。所以,如果我有一个复杂的形状,说一个人画一个视觉图形,一个星图。另一方面,我仍然需要区分这两种。DrawingVisual是为提高速度而选择的,但您还考虑了哪些其他方法?如前所述,路径元素。您可以将它们的数据属性绑定到视图模型类的几何体属性,并将它们组织到ItemsControl中。在性能达到一定要求之前,不应优化速度曼斯问题。