我在画布上移动了一个元素
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
它强调了删除处理程序,并说“表达式的地址没有效果,因为它需要一些放松的东西,代替并删除它!”
对我没用。
答案 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