Обработка событий в Visual Basic и WPFVisual Basic and WPF Event Handling

В частности, для языка Microsoft Visual Basic .NET можно использовать Handles ключевое слово для конкретного языка, чтобы связать обработчики событий с экземплярами, а не присоединять обработчики событий с атрибутами или с помощью AddHandler метода.For the Microsoft Visual Basic .NET language specifically, you can use the language-specific Handles keyword to associate event handlers with instances, instead of attaching event handlers with attributes or using the AddHandler method. Однако метод присоединения обработчиков к экземплярам Handles имеет некоторые ограничения, так как синтаксис Handles не поддерживает некоторые возможности перенаправленных событий системы событий WPFWPF.However, the Handles technique for attaching handlers to instances does have some limitations, because the Handles syntax cannot support some of the specific routed event features of the WPFWPF event system.

Использование ключевого слова Handles в приложениях WPFUsing "Handles" in a WPF Application

Все обработчики событий, которые подключены к экземплярам и событиям с помощью Handles, должны быть определены внутри объявления частичного класса экземпляра, который также является требованием для обработчиков событий, назначенных с помощью значений атрибутов в элементах.The event handlers that are connected to instances and events with Handles must all be defined within the partial class declaration of the instance, which is also a requirement for event handlers that are assigned through attribute values on elements. Можно указать только Handles для элемента на странице, у которого есть Name значение свойства (или объявленная Директива x:Name ).You can only specify Handles for an element on the page that has a Name property value (or x:Name Directive declared). Это обусловлено тем, что Name в XAMLXAML создает ссылку на экземпляр, необходимую для поддержки формата ссылки на экземпляр. Event , который требуется для Handles синтаксиса.This is because the Name in XAMLXAML creates the instance reference that is necessary to support the Instance.Event reference format required by the Handles syntax. Единственный элемент, который можно использовать для Handles без ссылки, Name — это экземпляр корневого элемента, определяющий разделяемый класс.The only element that can be used for Handles without a Name reference is the root-element instance that defines the partial class.

Можно назначить один и тот же обработчик для нескольких элементов, разделяя запятыми ссылки Instance.Event после Handles.You can assign the same handler to multiple elements by separating Instance.Event references after Handles with commas.

Можно использовать Handles для назначения более одного обработчика для той же ссылки Instance.Event.You can use Handles to assign more than one handler to the same Instance.Event reference. Не следует придавать значения порядку, в котором приведены обработчики в ссылке Handles; предполагается, что обработчики, обрабатывающие одно и тоже событие, могут вызываться в любом порядке.Do not assign any importance to the order in which handlers are given in the Handles reference; you should assume that handlers that handle the same event can be invoked in any order.

Чтобы удалить обработчик, который был добавлен Handles в объявление, можно вызвать RemoveHandler .To remove a handler that was added with Handles in the declaration, you can call RemoveHandler.

Можно использовать Handles для присоединения обработчиков для перенаправленных событий до тех пор, пока обработчики присоединяются к экземплярам, которые определяют обрабатываемое в таблицах элементов событие.You can use Handles to attach handlers for routed events, so long as you attach handlers to instances that define the event being handled in their members tables. Для перенаправленных событий обработчики, присоединенные с, Handles следуют тем же правилам маршрутизации, что и обработчики, присоединенные как XAMLXAML атрибуты, или с общей сигнатурой AddHandler .For routed events, handlers that are attached with Handles follow the same routing rules as do handlers that are attached as XAMLXAML attributes, or with the common signature of AddHandler. Это означает, что если событие уже помечено как обработанное ( Handled свойство в данных события имеет значение True ), обработчики, подключенные к, Handles не вызываются в ответ на этот экземпляр события.This means that if the event is already marked handled (the Handled property in the event data is True), then handlers attached with Handles are not invoked in response to that event instance. Событие не может быть помечено как обрабатываемое обработчиками экземпляров из другого элемента маршрута или обработкой класса либо из текущего элемента, либо из более ранних элементов маршрута.The event could be marked handled by instance handlers on another element in the route, or by class handling either on the current element or earlier elements along the route. Для событий ввода, которые поддерживают события восходящей и нисходящей маршрутизации, нисходящая маршрутизация может пометить пару событий как обрабатываемую.For input events that support paired tunnel/bubble events, the tunneling route may have marked the event pair handled. Дополнительные сведения о перенаправленных событиях см. в разделе Общие сведения о перенаправленных событиях.For more information about routed events, see Routed Events Overview.

Ограничения ключевого слова Handles при добавлении обработчиковLimitations of "Handles" for Adding Handlers

Ключевое слово Handles не может ссылаться на обработчики для присоединенных событий.Handles cannot reference handlers for attached events. Необходимо использовать метод доступа add для присоединенных событий или атрибуты события typename.eventname в XAMLXAML.You must use the add accessor method for that attached event, or typename.eventname event attributes in XAMLXAML. Дополнительные сведения см. в разделе Общие сведения о перенаправленных событиях.For details, see Routed Events Overview.

Для перенаправленных событий можно использовать Handles только для назначения обработчиков экземплярам, в которых это событие существует в таблице элементов экземпляра.For routed events, you can only use Handles to assign handlers for instances where that event exists in the instance members table. Однако в общем случае маршрутизации событий, родительский элемент может быть слушателем события от дочерних элементов, даже если этого события нет в таблице элементов родительского элемента.However, with routed events in general, a parent element can be a listener for an event from child elements, even if the parent element does not have that event in its members table. В синтаксисе атрибута это можно указать через форму атрибута typename.membername, которая определяет, какой тип фактически определяет обрабатываемое событие.In attribute syntax, you can specify this through a typename.membername attribute form that qualifies which type actually defines the event you want to handle. Например, родительский элемент Page (без Click определенного события) может прослушивать события нажатия кнопки путем назначения обработчика атрибута в форме Button.Click .For instance, a parent Page (with no Click event defined) can listen for button-click events by assigning an attribute handler in the form Button.Click. Но Handles не поддерживает форму typename.membername, так как он должен поддерживать конфликтующую форму Instance.Event.But Handles does not support the typename.membername form, because it must support a conflicting Instance.Event form. Дополнительные сведения см. в разделе Общие сведения о перенаправленных событиях.For details, see Routed Events Overview.

Handles не может присоединить обработчики, вызывающиеся для событий, которые уже отмечены как обрабатываемые.Handles cannot attach handlers that are invoked for events that are already marked handled. Вместо этого необходимо использовать код и вызвать handledEventsToo перегрузку AddHandler(RoutedEvent, Delegate, Boolean) .Instead, you must use code and call the handledEventsToo overload of AddHandler(RoutedEvent, Delegate, Boolean).

Примечание

Не используйте Handles синтаксис в коде Visual Basic при указании обработчика событий для того же события в XAML.Do not use the Handles syntax in Visual Basic code when you specify an event handler for the same event in XAML. В таком случае обработчик событий вызывается дважды.In this case, the event handler is called twice.

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

При Язык XAMLExtensible Application Markup Language (XAML) компиляции страницы промежуточный файл объявляет Friend WithEvents ссылки на каждый элемент на странице, где имеется Name набор свойств (или объявленная Директива x:Name ).When a Язык XAMLExtensible Application Markup Language (XAML) page is compiled, the intermediate file declares Friend WithEvents references to every element on the page that has a Name property set (or x:Name Directive declared). Каждый именованный экземпляр является потенциальным элементом, который можно присвоить обработчику с помощью Handles.Each named instance is potentially an element that can be assigned to a handler through Handles.

Примечание

В Visual Studio технология IntelliSense может показывать завершение для тех элементов, которые доступны для Handles ссылки на странице.Within Visual Studio, IntelliSense can show you completion for which elements are available for a Handles reference in a page. Но для того чтобы промежуточный файл смог заполнить все ссылки Friends, может потребоваться один проход компиляции.However, this might take one compile pass so that the intermediate file can populate all the Friends references.

См. также разделSee also