2017-06-08 2 views
2

私のアプリケーションは、ドラッグでドロップ可能なUIエレメントがいくつかあるキャンバスで構成され、さらにラインを使用して接続できます。パス内の特定のLineGeometryを削除する

2つのUIエレメントを接続するには、LineGeometryをその子としてさらに含むGeometryGroupで構成されるPathを使用しました。これをチェックしてくださいscreenshot

図のように、3つのアイテムは、2つのLineGeometryで構成されるPath経由で接続されています。私は 'Remove Link'オプションを実装しようとしていますが、私が行うことができるのはLineGeometryを削除するPath全体を削除することだけです。特定の線分を選択して削除するにはどうすればよいですか?

+0

'GeometryGroup.Children.Remove(幾何学)'オプションではないでしょうか? – Maxim

+0

@Maximあなたは正しいですが、そのためには、私が適切に実装できなかった特定のLineGeometryが最初に必要でした。 –

+0

下記の私の答えを参照してください。計算に必要な計算はありません。 – Maxim

答えて

1

ヒットテストに数式を実装していないソリューションがあります。たとえば、あなたがダウンしてマウスで行を削除する場合:Canvas_MouseDownは、次のように実装する必要があり

<Canvas Mouse.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); 
} 
+0

こんにちは、私はあなたの解決策を受け入れられた答えとしてマークしました。ありがとうございました :) –

-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 
} 
+0

私の質問に答える時間を投資してくれてありがとう。私はこのソリューションを試してみましょうし、その後、あなたに戻ってきます。 :) –

関連する問題