我正在使用wpf和vb.net在canvas上創建工作流設計器。我已經可以在具有很好功能的對象之間繪製線條(關係)。現在我想實現一種刪除關係的方法。我在形狀上添加了一個onclick處理程序,但該行非常薄且難以點擊。我聽說繪製2行1的行程厚度較厚,但這是不可能的,因爲drawline方法在cpu上很重。工作流設計器行onclick太薄
謝謝你幫
大衛
我正在使用wpf和vb.net在canvas上創建工作流設計器。我已經可以在具有很好功能的對象之間繪製線條(關係)。現在我想實現一種刪除關係的方法。我在形狀上添加了一個onclick處理程序,但該行非常薄且難以點擊。我聽說繪製2行1的行程厚度較厚,但這是不可能的,因爲drawline方法在cpu上很重。工作流設計器行onclick太薄
謝謝你幫
大衛
你可以鼠標按下事件處理程序添加到畫布上,而不是形狀的物體,然後再做Hit Testing in the Visual Layer(雖然API是有點怪)與hit test geometry,例如橢圓形。畫布需要設置其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
也許一個簡單的答案,但是當你添加新線到畫布上,你可以不喜歡
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
通過這種方式,當鼠標懸停在一條線上時,其筆劃厚度增加。這使得該行更易於點擊,並且可以爲用戶提供有關他們刪除的行的一些很好的反饋。
編輯添加VB代碼,針對上述情況,等待批准;) – 2012-04-12 13:13:56
是否擊中測試已經比使用下面所描述的方法更好的性能? – DavidVdd 2012-04-12 13:14:04
@DavidVdd - 通過命中測試,您可以指定鼠標周圍需要查找線條的區域(這裏是一個10x10橢圓),因此您可以有更大的容差區域,而不會使線條變得更大。他們都是快速/輕鬆的操作,無論如何,我認爲你不應該感受到他們的性能問題。 – 2012-04-12 13:16:05