Да , один и тот же метод может обрабатывать несколько событий, если они имеют совместимые подписи. Поскольку оба события MouseHover
и MouseLeave
имеют идентичные сигнатуры методов, это легко.
Под сигнатурами методов, конечно, я имею в виду передаваемые аргументы. Например, вот сигнатуры для метода, который обрабатывает оба этих события:
Sub MouseHoverHandler(ByVal sender As Object, ByVal e As System.EventArgs)
Sub MouseLeaveHandler(ByVal sender As Object, ByVal e As System.EventArgs)
Поскольку они идентичны, один и тот же метод может обрабатывать оба события. Все, что вам нужно сделать, это добавить имена обоих событий после ключевого слова Handles
, разделяя их запятой. Например:
Private Sub MegaHandler(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles myControl.MouseHover, myControl.MouseLeave
Но, увы , то, что делает , делает невозможным различие между событиями, так как для обоих будет вызван один и тот же обработчик. Это часто удобно, когда вы хотите выполнить идентичный код и не заботитесь о том, какое отдельное событие было вызвано.
Это не очень хороший вариант, когда вам нужно различать события. Но нет ничего плохого в определении нескольких методов-обработчиков событий. Это не повлияет на производительность вашего приложения.
Другой вариант, который вы могли бы рассмотреть, - это присоединение методов-заглушек в качестве обработчиков к обоим этим событиям, и заставить эти заглушки вызывать другой метод, который выполняет фактическую работу. Поскольку у каждого события будет свой отдельный обработчик, вы сможете определить, какое событие было вызвано, и передать эту информацию в качестве параметра в рабочий метод. Может быть, объяснение будет более понятным:
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
Бонусные баллы за признание того, что указание типа события лучше всего было бы реализовать, передав значение enum в метод мега-обработчика вместо логического значения. (Перечисления делают ваш исходный код гораздо более информативным; вам нужно проверить сигнатуру метода MegaMouseHandler
, чтобы узнать, что представляет собой логический параметр.)