Поделиться через


Обработка событий 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> требует, чтобы элемент 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.

См. также