Обработка событий в Visual Basic и WPF (WPF .NET)
Если вы программируете на Visual Basic .NET, вы можете использовать ключевое слово Handles для конкретного языка, чтобы присоединить обработчик событий к объекту. Объект может быть экземпляром в коде программной части или элементом в языке XAML. Handles
можно использовать для назначения обработчиков событий для событий общеязыковой среды выполнения (CLR) или перенаправленных событий Windows Presentation Foundation (WPF). Но Handles
имеет некоторые ограничения на использование при присоединении обработчиков событий для маршрутизируемых событий.
Необходимые компоненты
Для понимания статьи нужно иметь общее представление о перенаправленных событиях и прочитать статью Общие сведения о перенаправленных событиях. Чтобы понимать примеры в этой статье полезно познакомиться с языком XAML и знать, как создавать приложения Windows Presentation Foundation (WPF).
Синтаксис
Синтаксис объявления Sub
, использующего ключевое слово Handles, следующий: Sub <procedure name> Handles <object name>.<event name>
. Этот синтаксис определяет процедуру как обработчик событий, который будет выполняться, когда событие, указанное <event name>
, вызывается для объекта, указанного <object name>
. Событие должно быть членом класса объекта или базового класса. В следующем примере показано, как присоединить обработчик событий к элементу XAML с использованием Handles
.
' Click event handler attached to XamlButton using Handles.
Private Sub XamlButton_Click(sender As Object, e As RoutedEventArgs) Handles XamlButton.Click
' Handler logic.
Debug.WriteLine($"Click event handler attached to XamlButton using Handles.")
End Sub
Для использования Handles
с объектом, определенным в программном коде, обычно вы объявляете объект с использованием ключевого слова WithEvents. Дополнительные сведения об использовании WithEvents
см. в этих примерах. WPF автоматически объявляет все элементы XAML с использованием Friend WithEvents
. В следующем примере показано, как объявить объект, определенный в коде программной части с использованием WithEvents
.
' Declare a new button using WithEvents.
Dim WithEvents CodeButton As New Button With {
.Content = "New button",
.Background = Brushes.Yellow
}
' Click event handler attached to CodeButton using Handles.
Private Sub CodeButton_Click(sender As Object, e As RoutedEventArgs) Handles CodeButton.Click
' Handler logic.
Debug.WriteLine($"Click event handler attached to CodeButton using Handles.")
End Sub
Чтобы использовать один и тот же обработчик для нескольких событий, разделите события <object name>.<event name>
запятыми. Например, Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Click
. Порядок событий, разделенных запятыми, не имеет значения.
Вы можете назначить разные обработчики для одного и того же события с использованием нескольких операторов Handles
. Порядок операторов Handles
не определяет порядок, в котором вызываются обработчики при возникновении события.
Совет
Чтобы удалить обработчик, добавленный с использованием Handles
, вызовите RemoveHandler. Например, RemoveHandler Button1.Click, AddressOf Button1_Click
.
Использование ключевого слова Handles в приложении WPF
Для объекта, определенного в XAML, синтаксис <object name>.<event name>
события Handles требует, чтобы элемент XAML, представляющий объект, имел свойство Name или x:Name. Но свойство имени не требуется для корневого элемента страницы XAML, для которого можно использовать имя Me
. В следующем примере показано, как присоединить обработчик событий к корню страницы XAML с использованием Handles
.
' Loaded event handler attached to the XAML page root using Handles.
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
' Handler logic.
Debug.WriteLine($"Loaded event handler attached to Window using Handles.")
End Sub
При компиляции страницы XAML каждый элемент XAML с параметром Name
или x:Name
объявляется как Friend WithEvents
. В результате можно использовать любой элемент XAML с Handles
.
Совет
В Visual Studio IntelliSense показаны объекты, которые можно использовать с Handles
.
Независимо от того, присоединяете ли вы обработчик событий с использованием Handles
, синтаксиса атрибута XAML, инструкции AddHandler или метода AddHandler, поведение системы событий будет одинаковым.
Примечание.
Не используйте оба атрибута XAML и Handles
для присоединения одного обработчика событий к одному событию, иначе обработчик событий будет вызываться дважды для каждого события.
Ограничения
Ключевое слово Handles имеет следующие ограничения использования:
Вы можете использовать
Handles
только для присоединения обработчика событий к объекту, если событие является членом класса объекта или базового класса. Например, вы можете использоватьHandles
для присоединения обработчика событий Click к кнопке, базовый класс ButtonBase которой вызывает маршрутизируемое событиеClick
. Однако одной из особенностей маршрутизируемых событий является то, что они проходят по дереву элементов, что позволяет прослушивать и обрабатывать событиеClick
на более высоком уровне, чем тот элемент, который его породил. Маршрутизируемое событие, которое прослушивает и обрабатывает родительский элемент, называется присоединенным событием.Handles
нельзя использовать для присоединенных событий, так как синтаксис не поддерживает указание в дереве элементов XAML прослушивателя, отличного от элемента, вызвавшего событие. Чтобы назначить обработчики событий для присоединенных событий, вам потребуется использовать синтаксис атрибута XAML или метод AddHandler. Дополнительные сведения о присоединенных событиях см. в статьях Обзор присоединенных событий и Присоединенные события в WPF.Синтаксис
Handles
не поддерживает вызов обработчика событий для событий Handled. Чтобы ваш обработчик событий мог вызываться для событийHandled
, присоедините обработчик событий с помощью метода AddHandler(RoutedEvent, Delegate, Boolean) и установите для его параметраhandledEventsToo
значениеtrue
.
См. также
.NET Desktop feedback