1

我正在制作一个工作流设计器,用 wpf 和 vb.net 在画布上创建工作流。我已经可以在具有良好功能的对象之间绘制线条(关系)。现在我想实现一种删除关系的方法。我在形状上添加了一个 onclick 处理程序,但线条非常细且难以点击。我听说要绘制 2 条线 1 的笔画粗细,但这是不可能的,因为 drawline 方法在 cpu 上很重。

谢谢你的帮忙

大卫

4

2 回答 2

3

您可以将鼠标按下事件处理程序添加到 Canvas,而不是 Shape 对象,然后在 Visual Layer中使用命中测试几何体(例如椭圆)进行命中测试(虽然 API 有点奇怪) 。Canvas 需要Background设置(例如 to Transparent)来接收鼠标事件。

抱歉,这是 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 不支持多行 lambda 表达式,因此必须显式声明命中测试回调

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 回答