2013-07-02 83 views
2

我得到了這一塊的畫布上走動的元素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 

它強調了removehandler並說像「的addressof表達沒有任何影響,因爲它需要一個寬鬆取而代之的是一些東西,讓代表和刪除!「

對我沒有意義。

回答

4

這是因爲moveLoop方法的簽名並不在MouseEventHandler委託的簽名相匹配。由於VB.NET非常寬鬆,它允許您將它作爲事件的處理程序添加,方法是使用調用處理程序的必需參數在內部創建一個匿名方法。但是,當您嘗試刪除處理程序時,它不起作用,因爲之前創建的匿名方法不再可用...

最簡單的修復方法是更改​​方法的簽名,使其與代表:

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

另一種選擇是存儲對keyboardP的回答所示的處理程序的引用。

2

創建一個新的EventHandler,然後添加和刪除像這樣

Dim moveLoopHandler As New EventHandler(AddressOf moveLoop) 

AddHandler canvasRef.MouseMove, moveLoopHandler 

RemoveHandler canvasRef.MouseMove, moveLoopHandler