2

我得到了这件作品,用于在画布上移动元素

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

它在 removehandler 下划线并说类似“addressof 表达式没有效果,因为它需要一个轻松的东西,请委托并删除它!”

对我来说毫无意义。

4

2 回答 2

7

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

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

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

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

于 2013-07-02T13:23:38.027 回答
3

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

Dim moveLoopHandler As New EventHandler(AddressOf moveLoop)

AddHandler canvasRef.MouseMove, moveLoopHandler 

RemoveHandler canvasRef.MouseMove, moveLoopHandler 
于 2013-07-02T13:21:27.123 回答