2012-04-12 123 views
1

我正在使用wpf和vb.net在canvas上創建工作流設計器。我已經可以在具有很好功能的對象之間繪製線條(關係)。現在我想實現一種刪除關係的方法。我在形狀上添加了一個onclick處理程序,但該行非常薄且難以點擊。我聽說繪製2行1的行程厚度較厚,但這是不可能的,因爲drawline方法在cpu上很重。工作流設計器行onclick太薄

謝謝你幫

大衛

回答

3

你可以鼠標按下事件處理程序添加到畫布上,而不是形狀的物體,然後再做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 
+1

編輯添加VB代碼,針對上述情況,等待批准;) – 2012-04-12 13:13:56

+0

是否擊中測試已經比使用下面所描述的方法更好的性能? – DavidVdd 2012-04-12 13:14:04

+0

@DavidVdd - 通過命中測試,您可以指定鼠標周圍需要查找線條的區域(這裏是一個10x10橢圓),因此您可以有更大的容差區域,而不會使線條變得更大。他們都是快速/輕鬆的操作,無論如何,我認爲你不應該感受到他們的性能問題。 – 2012-04-12 13:16:05

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 

通過這種方式,當鼠標懸停在一條線上時,其筆劃厚度增加。這使得該行更易於點擊,並且可以爲用戶提供有關他們刪除的行的一些很好的反饋。

相關問題