1

wpfとvb.netでキャンバス上にワークフローを作成するワークフローデザイナーを作っています。オブジェクト間の線(関係)をnice関数で引けるようにしました。ここで、関係を削除する方法を実装したいと思います。形状に onclick ハンドラを追加しましたが、線が非常に細くてクリックしにくいです。太いストロークで2行1を描くと聞いたことがありますが、drawlineメソッドはCPUに負荷がかかるため、これは不可能です。

助けてくれてありがとう

デビッド

4

2 に答える 2

3

Shape オブジェクトの代わりにキャンバスにマウス ダウン イベント ハンドラーを追加し、楕円などのヒット テスト ジオメトリを使用して (API は少し奇妙ですが)ビジュアル レイヤーでヒット テストを実行できます。Canvas は、マウス イベントを受信するために、そのセット (たとえば to ) を持っている必要があります。BackgroundTransparent

これは C# で申し訳ありませんが、VB は話せません。

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    Canvas canvas = sender as Canvas;
    EllipseGeometry hitTestGeometry =
        new EllipseGeometry(e.GetPosition(canvas), 10d, 10d);
    Shape hitShape = null;

    HitTestResultCallback hitTestCallback =
        result =>
        {
            hitShape = result.VisualHit as Shape;
            return hitShape != null ? HitTestResultBehavior.Stop : HitTestResultBehavior.Continue;
        };

    VisualTreeHelper.HitTest(canvas, null, hitTestCallback, new GeometryHitTestParameters(hitTestGeometry));

    if (hitShape != null)
    {
        System.Diagnostics.Trace.TraceInformation("hit shape: {0}", hitShape);
    }
}

編集:

同等の VB コードを次に示します。VB は複数行のラムダ式をサポートしていないため、ヒット テストのコールバックを明示的に宣言する必要があります。

Private Function htCallback(ByVal result As HitTestResult) _
 As HitTestResultBehavior
    Dim hitShape As Shape = Nothing
    hitShape = TryCast(result.VisualHit, Shape)
    If hitShape IsNot Nothing Then
        'do something 
    End If
    Return If(hitShape IsNot Nothing, HitTestResultBehavior.[Stop], _
      HitTestResultBehavior.[Continue])
End Function


Private Sub Canvas_MouseLeftButtonDown(ByVal sender As Object, _
  ByVal e As MouseButtonEventArgs) Handles Canvas1.MouseRightButtonDown
    Dim canvas As Canvas = TryCast(sender, Canvas)
    Dim hitTestGeometry As New EllipseGeometry(e.GetPosition(canvas), 10.0, 10.0)
    Dim hitTestCallback As HitTestResultCallback = _
      New HitTestResultCallback(AddressOf htCallback)
    VisualTreeHelper.HitTest(canvas, Nothing, hitTestCallback, _
      New GeometryHitTestParameters(hitTestGeometry))
End Sub
于 2012-04-12T12:41:56.920 に答える
2

簡単な答えかもしれませんが、新しい行をキャンバスに追加すると、次のようなことができます

AddHandler myLine.MouseEnter, AddressOf lineHover
AddHandler myLine.MouseLeave, AddressOf lineLeave
AddHandler myLine.MouseDown, AddressOf lineDelete
Canvas1.Children.Add(myLine)

どこ

Private Sub lineHover(ByVal sender As Object, ByVal e As MouseEventArgs)
    CType(sender, Line).StrokeThickness = 3
End Sub

Private Sub lineLeave(ByVal sender As Object, ByVal e As MouseEventArgs)
    CType(sender, Line).StrokeThickness = 1
End Sub

Private Sub lineDelete(ByVal sender As Object, ByVal e As MouseEventArgs)
    Canvas1.Children.Remove(CType(sender, Line))
End Sub

このように、マウスを線の上に置くと、ストロークの太さが増します。これにより、行をクリックしやすくなり、ユーザーがどの行を削除しようとしているのかについて、適切なフィードバックを得ることができます。

于 2012-04-12T12:31:11.677 に答える