如何在处理多个事件的Sub中获取事件类型?

| 我正在使用Visual Basic 2010 Express创建一个程序。 我想让
Sub
处理
MouseHover
MouseLeave
事件。这可能吗?并且,如果可能的话,MouseHover事件和MouseLeave事件之间有何区别?     
已邀请:
是的,只要它们具有兼容的签名,同一方法就可以处理多个事件。由于
MouseHover
MouseLeave
事件都具有相同的方法签名,因此这很容易。 当然,方法签名是指传入的参数。例如,以下是处理这两个事件的方法的签名:
Sub MouseHoverHandler(ByVal sender As Object, ByVal e As System.EventArgs)
Sub MouseLeaveHandler(ByVal sender As Object, ByVal e As System.EventArgs)
由于这些相同,因此相同的方法可以处理两个事件。您要做的就是在both6ѭ关键字之后添加两个事件的名称,并用逗号分隔它们。例如:
Private Sub MegaHandler(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles myControl.MouseHover, myControl.MouseLeave
但是,可惜的是,确实无法区分事件,因为两个事件都需要使用相同的处理程序。当您要执行相同的代码而不必关心引发哪个事件时,这通常很方便。 当您需要区分事件时,这不是一个好的选择。但是定义多个事件处理程序方法绝对没有错。它不会影响您的应用程序的性能。 您可以考虑的另一种选择是将存根方法附加为这两个事件的处理程序,并让这些存根调用另一个执行实际工作的方法。因为每个事件都有自己的处理程序,所以您可以确定引发了哪个事件,并将该信息作为参数传递给worker方法。也许解释会更清楚:
Private Sub MouseHoverHandler(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles myControl.MouseHover

    \' Call the method that does the actual work
    DoMouseWork(sender, e, True)    
End Sub

Private Sub MouseLeaveHandler(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles myControl.MouseHover

    \' Call the method that does the actual work
    DoMouseWork(sender, e, False)    
End Sub

Private Sub MegaMouseHandler(ByVal sender As System.Object, ByVal e As System.EventArgs, _
                             ByVal isHover As Boolean)
    \' Do the appropriate work to handle the events here.

    \' If the isHover parameter is True, the MouseHover event was raised.
    \' If the isHover parameter is False, the MouseLeave event was raised.
 End Sub
认识到指定事件类型的最佳方法是将枚举值(而不是布尔值)传递给mega-handler方法,以实现最佳效果。 (枚举使您的源代码更具描述性;您必须检查
MegaMouseHandler
方法的签名才能知道Boolean参数代表什么。)     

要回复问题请先登录注册