2017-07-14 78 views
0

当我创建像自定义处理程序:部队自定义事件处理程序首先

Public Class MyCustomClass 
    Public Sub AddHandlers() 
     AddHandler Form1.MouseMove, AddressOf MoveMouse 
    End Sub 
    Private Sub MoveMouse(sender As Object, e As MouseEventArgs) 
     MsgBox("Needs to happen first.") 
    End Sub 
End Class 

我需要MoveMouse在这个类当用户在Form1的将鼠标移动任何其他事件之前触发。

Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove 
    MsgBox("Needs to happen second.") 
End Sub 

在写这个,我意识到我可以在Form1的类再创建一个自定义事件处理程序,但没有任何其他的方式,以确保MoveMouse(不管它是什么类)Form1_MouseMove之前发生?

Thanks- 〜尼克

+0

要添加处理同一事件 - 2个处理程序是毫无意义的同一事件 - 只需将代码添加到现有的事件。请注意'AddHandler'添加一个处理程序(!),因此已经存在的处理程序将首先触发。 – Plutonix

+0

我知道。这是假设有一个理由有2个处理程序。我打算做一个应用程序扩展文件,它将处理表格中的某些事件,但要求它们先发射。 – NinjaNic

+0

我不知道什么是'应用程序扩展',但事件是私人的形式同一个应用程序的其他部分甚至不知道他们:'Private Sub MoveMouse(...)' – Plutonix

回答

1

活动都在其声明的顺序触发:

所以,如果你希望你的自定义类到Form1之前在Form1上提高MouseMove提出你需要的事件使您的自定义类中添加处理第一:

Public Class CustomClass 
    Public Sub OnMouseMoved(sender As Object, e As MouseEventArgs) 
     Console.WriteLine("Custom mouse moved") 
    End Sub 
End Class 

Public Class Form1 
    Public Custom As CustomClass 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Custom = New CustomClass 
     AddHandler MouseMove, AddressOf Custom.OnMouseMoved 
     AddHandler MouseMove, AddressOf OnMouseMoved 
End Sub 

    Private Sub OnMouseMoved(sender As Object, e As MouseEventArgs) 
     Console.WriteLine("Form1 mouse moved") 
    End Sub 
End Class 
+0

这或多或少是我在寻找的东西,但更多的只是让人放心,除了您使用的“AddHandler”的顺序之外,没有其他因素可以起作用。 – NinjaNic

+0

@NinjaNic:不是,不。它或多或少[**结合**](https://msdn.microsoft.com/en-us/library/30cyx32c(v = vs.110).aspx)代表(事件处理程序)添加它们时,从而使您添加的第一个被首先调用。 –

相关问题