Обработка событий в Visual Basic и WPF (WPF .NET)

Если вы программируете на Visual Basic .NET, вы можете использовать ключевое слово Handles для конкретного языка, чтобы присоединить обработчик событий к объекту. Объект может быть экземпляром в коде программной части или элементом в языке XAML. Handles можно использовать для назначения обработчиков событий для событий общеязыковой среды выполнения (CLR) или перенаправленных событий Windows Presentation Foundation (WPF). Но Handles имеет некоторые ограничения на использование при присоединении обработчиков событий для маршрутизируемых событий.

Важно!

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

Необходимые компоненты

Для понимания статьи нужно иметь общее представление о перенаправленных событиях и прочитать статью Общие сведения о перенаправленных событиях. Чтобы понимать примеры в этой статье полезно познакомиться с языком 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.

См. также