Обработка событий 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
.
См. также
- AddHandler
- Маркировка маршрутизированных событий как обработанных и обработка на уровне класса
- Обзор маршрутизируемых событий
- Общие сведения о присоединенных событиях
- XAML в WPF
.NET Desktop feedback