vb.net无法删除处理程序

Jak*_*der 2 vb.net wpf

我得到这是因为在画布上移动元素

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
Run Code Online (Sandbox Code Playgroud)

它强调了removehandler并说了一些类似的内容:“ addressof表达式无效,因为它需要放宽某些东西,然后委托它,然后删除它!”

对我来说毫无意义。

Tho*_*que 5

这是因为moveLoop方法的签名与MouseEventHandler委托的签名不匹配。由于VB.NET非常松懈,因此它允许您通过内部创建带有调用处理程序的必需参数的匿名方法,将其添加为事件的处理程序。但是,当您尝试删除处理程序时,它将无法工作,因为以前创建的匿名方法不再可访问...

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

Private Sub moveLoop(ByVal sender As Object, ByVal e As MouseEventArgs)
Run Code Online (Sandbox Code Playgroud)

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