删除路径中的特定LineGeometry

时间:2017-06-08 07:53:57

标签: c# wpf

我的应用程序包含一个带有一些用户可拖放UI元素的画布,可以使用行进一步连接。

为了连接两个UIelements,我使用了一个包含GeometryGroup的Path,它还包含LineGeometry作为其子元素。请检查此screenshot

如图所示,这三个项目通过一个由2个LineGeometry组成的Path连接。我正在尝试实现“删除链接”选项,但我所能做的就是删除整个路径,这将删除LineGeometry。我如何具体选择特定的线段并将其删除?

2 个答案:

答案 0 :(得分:1)

有一个解决方案没有实现命中测试的数学运算。例如,如果要通过鼠标按下删除行:

<Canvas Mouse.MouseDown="Canvas_MouseDown">

其中Canvas_MouseDown应该像这样实现:

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
    var canvas = sender as Canvas;
    if (canvas == null)
        return;

    // 1. Find a Path containing links

    HitTestResult hitTestResult = VisualTreeHelper.HitTest(canvas, e.GetPosition(canvas));
    var path = hitTestResult.VisualHit as Path;
    if (path == null)
        return;

    // 2. Iterate through geometries of the Path and hit test each one
    //    to find a line to delete

    var geometryGroup = path.Data as GeometryGroup;
    if (geometryGroup == null)
        return;

    GeometryCollection geometries = geometryGroup.Children;
    Point point = e.GetPosition(path);
    var pen = new Pen(path.Stroke, path.StrokeThickness);

    var lineToDelete = geometries.OfType<LineGeometry>()
                                 .FirstOrDefault(l => l.StrokeContains(pen, point));

    // 3. Delete link

    if (lineToDelete != null)
        geometries.Remove(lineToDelete);
}

答案 1 :(得分:-1)

您需要到点击点的距离。

public void RemoveLink(Point point)
{
    // ...

    // point - 2D click point
    // lineList - list of links (lines)
    setDistance(lineList, point)

    lineList.Sort(compare);
    lineList[0].remove();
    // ...
}

private static Comparison<GeomObject> compare = new Comparison<GeomObject>(GeomObject.CompareByDistance);

public static int CompareByDistance(GeomObject go1, GeomObject go2)
{
    return go1.mDistance.CompareTo(go2.mDistance);
}

private void setDistance(List<Line> lineList, Point point) {
    // set mDistance for each Line
    // mDistance - distance to point
}