首页 > 解决方案 > WPF DrawingVisual中跟踪DrawingVisual的方案

问题描述

我正在 WPF 中创建一个 CAD 程序,用于添加和删除线条和矩形,这两者都由 PathGeometry 描述。当我进一步了解该程序时,它将包含大量不同的 PathGeometries,每个 PathGeometries 都构成了各个 DrawingVisuals 的属性。出于性能原因,我使用 Visual 类。

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

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

当我以调试模式(通过 Debug>Window 访问)进入 visualTree 时,它​​只显示“DrawingVisual”。这些信息不足以知道如何将其视为一条线或一个矩形。

因此,在大型 CAD 程序中,它们允许您修改单击的对象。该软件有某种方式知道您点击了什么,我希望在我的初学者级 CAD 程序中拥有该功能。

我尝试使用调试功能并寻找某种唯一标识符,但找不到。我考虑过使用 List 并在创建每个项目时给出它,但我无法将它与 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 程序使用什么方案来跟踪鼠标点击的 Visual 类型是什么?

TYIA

标签: c#wpfpathgeometrydrawingvisual

解决方案


推荐阅读