Visual Basic と WPF のイベント処理Visual 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.

WPF アプリケーションでの "ハンドル" の使用Using "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). これは、XAMLXAMLName によって、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. Name 参照のない Handles に使用できる唯一の要素は、部分クラスを定義するルート要素のインスタンスです。The only element that can be used for Handles without a Name reference is the root-element instance that defines the partial class.

インスタンスを分離することによって、複数の要素に同じハンドラーを割り当てることができます。 Handles の後にコンマが含まれるようになります。You can assign the same handler to multiple elements by separating Instance.Event references after Handles with commas.

Handles を使用して、同じインスタンスに複数のハンドラーを割り当てることができます。イベントの参照。You can use Handles to assign more than one handler to the same Instance.Eventreference. 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.

ハンドラーを追加するための "処理" の制限事項Limitations of "Handles" for Adding Handlers

Handles は、添付イベントのハンドラーを参照できません。Handles cannot reference handlers for attached events. この添付イベントには add アクセサーメソッドを使用し、XAMLXAMLではtypenameイベント属性を使用する必要があります。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. たとえば、(Click イベントが定義されていない) 親 Page は、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フォームはサポートされません。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. 代わりに、コードを使用し、AddHandler(RoutedEvent, Delegate, Boolean)handledEventsToo オーバーロードを呼び出す必要があります。Instead, you must use code and call the handledEventsToo overload of AddHandler(RoutedEvent, Delegate, Boolean).

注意

XAML で同じイベントに対してイベントハンドラーを指定する場合は、Visual Basic コードで Handles 構文を使用しないでください。Do not use the Handles syntax in Visual Basic code when you specify an event handler for the same event in XAML. この場合、イベントハンドラーは2回呼び出されます。In this case, the event handler is called twice.

WPF が "ハンドル" 機能を実装する方法How WPF Implements "Handles" Functionality

Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) ページがコンパイルされると、中間ファイルによって、Name プロパティが設定されている (またはX:Name ディレクティブが宣言されている) ページ上のすべての要素への Friend WithEvents 参照が宣言されます。When a Extensible Application Markup Language (XAML)Extensible 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 参照を設定できるように、1つのコンパイルパスが必要になることがあります。However, this might take one compile pass so that the intermediate file can populate all the Friends references.

関連項目See also