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


Обработка событий в Visual Basic и WPF

Обновлен: Ноябрь 2007

Специально для языка 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).

Как в WPF реализуются функциональные возможности ключевого слова «Handles»

После компиляции страницы Язык XAML (Extensible Application Markup Language) промежуточный файл объявляет ссылки FriendWithEvents на каждый элемент страницы, который имеет свойство Name (или объявлен Атрибут x:Name). Каждый именованный экземпляр является потенциальным элементом, который можно присвоить обработчику с помощью Handles.

Aa970684.alert_note(ru-ru,VS.90).gifПримечание.

В Microsoft Visual StudioIntelliSense может показать варианты завершения элементами, доступными для ссылки Handles на странице. Но для того, чтобы промежуточный файл смог заполнить все ссылки Friends, может потребоваться один проход компиляции.

См. также

Основные понятия

Маркировка перенаправленных событий как обработанных и обработка классов

Общие сведения о перенаправленных событиях

Общие сведения о XAML

Ссылки

AddHandler