vb.net无法删除处理程序

时间:2013-07-02 13:11:50

标签: wpf vb.net

我在画布上移动了一个元素

Private p As Point
Private Sub moveHandler() Handles Me.MouseDown
    p = Mouse.GetPosition(Me)
    AddHandler canvasRef.MouseMove, AddressOf moveLoop
End Sub
Private Sub moveLoop()
    If Mouse.LeftButton = MouseButtonState.Pressed Then
        Dim c As Point = Mouse.GetPosition(canvasRef)
        Canvas.SetLeft(Me, c.X - p.X)
        Canvas.SetTop(Me, c.Y - p.Y)
    Else
        RemoveHandler canvasRef.MouseMove, AddressOf moveLoop
    End If
End Sub

它强调了删除处理程序,并说“表达式的地址没有效果,因为它需要一些放松的东西,代替并删除它!”

对我没用。

2 个答案:

答案 0 :(得分:5)

那是因为moveLoop方法的签名与MouseEventHandler委托的签名不匹配。由于VB.NET如此宽松,它允许您将其添加为事件的处理程序,方法是在内部创建一个匿名方法,其中包含调用处理程序所需的参数。但是当您尝试删除处理程序时,它不起作用,因为之前创建的匿名方法不再可访问...

最简单的解决方法是更改​​方法的签名,使其与委托的签名匹配:

Private Sub moveLoop(ByVal sender As Object, ByVal e As MouseEventArgs)

另一种选择是存储对处理程序的引用,如keyboardP的答案所示。

答案 1 :(得分:2)

创建一个新的EventHandler,然后像这样添加和删除

Dim moveLoopHandler As New EventHandler(AddressOf moveLoop)

AddHandler canvasRef.MouseMove, moveLoopHandler 

RemoveHandler canvasRef.MouseMove, moveLoopHandler