我正在制作一个workflowdesigner,用wpf和vb.net在画布上创建工作流程。我已经可以在具有良好功能的对象之间绘制线条(关系)。现在我想实现一种删除关系的方法。我在形状上添加了一个onclick处理程序,但该行非常薄且难以点击。我听说画了2行1,行程厚度较粗,但这是不可能的,因为画线方法在cpu上很重。
感谢您的帮助
大卫
答案 0 :(得分:3)
您可以将鼠标按下事件处理程序添加到Canvas而不是Shape对象,然后使用Hit Testing in the Visual Layer执行hit test geometry(尽管API有点奇怪),例如椭圆。 Canvas需要设置Background
(例如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
答案 1 :(得分: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
这样当你的鼠标悬停在一条线上时,它的笔触粗细就会增加。这使得该行更容易点击,并且还为您的用户提供了关于他们删除哪一行的一些很好的反馈。