Обработка событий в Visual Basic и WPF
Для языка Microsoft Visual Basic .NET в частности, можно использовать конкретного языка Handles
ключевое слово, чтобы связать обработчики событий с экземплярами, вместо присоединения обработчиков событий с атрибутами или с помощью AddHandler метод. Однако метод присоединения обработчиков к экземплярам Handles
имеет некоторые ограничения, так как синтаксис Handles
не поддерживает некоторые возможности перенаправленных событий системы событий WPF.
Использование ключевого слова Handles в приложениях WPF
Все обработчики событий, которые подключены к экземплярам и событиям с помощью Handles
, должны быть определены внутри объявления частичного класса экземпляра, который также является требованием для обработчиков событий, назначенных с помощью значений атрибутов в элементах. Можно указать только Handles
для элемента на странице, которая имеет Name значение свойства (или директива x: Name объявлен). Это обусловлено Name в XAML создает ссылку на экземпляр, который необходим для поддержки Instance.Event формат ссылки, необходимые Handles
синтаксис. Единственным элементом, который может использоваться для Handles
без Name ссылка является экземпляром корневого элемента, который определяет разделяемый класс.
Можно назначить один и тот же обработчик для нескольких элементов, разделяя запятыми ссылки Instance.Event после Handles
.
Можно использовать Handles
для назначения более одного обработчика для той же ссылки Instance.Event. Не следует придавать значения порядку, в котором приведены обработчики в ссылке Handles
; предполагается, что обработчики, обрабатывающие одно и тоже событие, могут вызываться в любом порядке.
Чтобы удалить обработчик, который был добавлен с Handles
в объявлении, можно вызвать RemoveHandler.
Можно использовать Handles
для присоединения обработчиков для перенаправленных событий до тех пор, пока обработчики присоединяются к экземплярам, которые определяют обрабатываемое в таблицах элементов событие. Для перенаправленных событий, обработчики, присоединенные с помощью Handles
следуют тем же правилам маршрутизации, что и обработчики, присоединенные как XAML атрибуты, или с общей сигнатурой AddHandler. Это означает, что если событие уже помечено как обработанное ( Handled свойство в данных события является True
), то обработчики, присоединенные с помощью Handles
не вызываются в ответ на этот экземпляр события. Событие не может быть помечено как обрабатываемое обработчиками экземпляров из другого элемента маршрута или обработкой класса либо из текущего элемента, либо из более ранних элементов маршрута. Для событий ввода, которые поддерживают события восходящей и нисходящей маршрутизации, нисходящая маршрутизация может пометить пару событий как обрабатываемую. Дополнительные сведения о перенаправленных событиях см. в разделе Общие сведения о перенаправленных событиях.
Ограничения ключевого слова Handles при добавлении обработчиков
Handles
не может ссылаться на обработчики для присоединенных событий. Необходимо использовать метод доступа add
для присоединенных событий или атрибуты события typename.eventname в XAML. Дополнительные сведения см. в разделе Общие сведения о перенаправленных событиях.
Для перенаправленных событий можно использовать Handles
только для назначения обработчиков экземплярам, в которых это событие существует в таблице элементов экземпляра. Однако в общем случае маршрутизации событий, родительский элемент может быть слушателем события от дочерних элементов, даже если этого события нет в таблице элементов родительского элемента. В синтаксисе атрибута это можно указать через форму атрибута typename.membername, которая определяет, какой тип фактически определяет обрабатываемое событие. Например, родительский Page
(не имеющий Click
события, определенного) может прослушивать события нажатий кнопки путем назначения атрибута обработчика в форме Button.Click
. Но Handles
не поддерживает форму typename.membername, так как он должен поддерживать конфликтующую форму Instance.Event. Дополнительные сведения см. в разделе Общие сведения о перенаправленных событиях.
Handles
не удается присоединить обработчики, вызывающиеся для событий, которые уже помечено как обработанное. Вместо этого необходимо использовать код и вызвать handledEventsToo
перегруженная версия AddHandler(RoutedEvent, Delegate, Boolean).
Note
Не используйте Handles
синтаксиса в коде Visual Basic при указании обработчик событий для того же события в XAML. В таком случае обработчик событий вызывается дважды.
Как в WPF реализуются функциональные возможности ключевого слова Handles
Когда XAML компиляции страницы промежуточный файл объявляет Friend
WithEvents
ссылки на страницу, содержащую каждый элемент Name набор свойств (или директива x: Name объявлен). Каждый именованный экземпляр является потенциальным элементом, который можно присвоить обработчику с помощью Handles
.
Note
В Microsoft Visual Studio IntelliSense может показать варианты завершения элементами, доступными для ссылки Handles
на странице. Но для того чтобы промежуточный файл смог заполнить все ссылки Friends
, может потребоваться один проход компиляции.