Visual Basic と WPF のイベント処理

特に Microsoft Visual Basic .NET 言語の場合、イベント ハンドラーを属性に添付したり、AddHandler メソッドを使用したりする代わりに、言語固有の Handles キーワードを使用して、イベント ハンドラーをインスタンスに関連付けることができます。 ただし、Handles 構文では WPF イベント システムの特定のルーティング イベント機能の一部をサポートできないため、ハンドラーをインスタンスに添付する Handles 手法にはいくつかの制限があります。

WPF アプリケーションでの "ハンドル" の使用

Handles を使用するインスタンスとイベントに接続されているイベント ハンドラーは、すべてインスタンスの部分クラス宣言内で定義する必要があります。これは、要素の属性値を介して割り当てられるイベント ハンドラーの要件でもあります。 Name プロパティ値 (または宣言されている x:Name Directive) を持つページの要素に対してのみ、Handles を指定できます。 これは、XAML の Name によって、Handles 構文に必要な Instance.Event 参照形式をサポートするために必要なインスタンス参照が作成されるためです。 Name 参照なしで Handles に使用できる唯一の要素は、部分クラスを定義するルート要素インスタンスです。

Handles の後の Instance.Event 参照をコンマで区切ることにより、同じハンドラーを複数の要素に割り当てることができます。

Handles を使用して、同じ Instance.Event 参照に複数のハンドラーを割り当てることができます。 Handles 参照でハンドラーが指定されている順序で重要度を割り当てないでください。同じイベントを処理するハンドラーは任意の順序で呼び出される可能性があることを想定する必要があります。

宣言で Handles と共に追加されたハンドラーを削除するには、RemoveHandler を呼び出します。

メンバー テーブルで処理されるイベントを定義するハンドラーをインスタンスに添付している限り、Handles を使用してルーティング イベントのハンドラーを添付できます。 ルーティング イベントの場合、Handles に添付されたハンドラーは、XAML 属性として添付されたハンドラーと同じルーティング規則に従うか、共通の署名 AddHandler を使用します。 つまり、イベントが既に処理済みとしてマークされている場合 (イベント データの Handled プロパティが True の場合)、そのイベント インスタンスに応答して Handles に添付されたハンドラーが呼び出されません。 イベントは、ルート内の別の要素のインスタンス ハンドラーによって処理されるか、現在の要素またはルート上の以前の要素のいずれかを処理するクラスによってマークされる可能性があります。 ペアのトンネルおよびバブル イベントをサポートする入力イベントの場合、トンネリング ルートによってイベント ペアが処理済みとマークされる場合があります。 ルーティング イベントの詳細については、「ルーティング イベントの概要」を参照してください。

ハンドラーを追加するための "ハンドル" の制限事項

Handles では、添付イベントのハンドラーを参照できません。 この添付イベント、つまり XAML の typename.eventname には、add アクセサー メソッドを使用する必要があります。 詳細については、「ルーティング イベントの概要」を参照してください。

ルーティング イベントの場合、Handles を使用してインスタンス メンバー テーブルにそのイベントが存在するインスタンスにハンドラーを割り当てることができます。 ただし、一般にルーティング イベントでは、親要素のメンバー テーブルにそのイベントがない場合でも、親要素は子要素からのイベントのリスナーになることができます。 属性構文では、typename.membername 属性フォームを使用してこれを指定できます。これにより、処理するイベントを実際に定義する型を修飾できます。 たとえば、親 Page (Click イベントが定義されていない) では、Button.Click の形式で属性ハンドラーを割り当てることにより、ボタンクリック イベントをリッスンできます。 ただし、Handles では typename.membername フォームをサポートしていません。これは、競合する Instance.Event フォームをサポートする必要があるためです。 詳細については、「ルーティング イベントの概要」を参照してください。

Handles を使用しても、既に処理済みとマークされているイベントに対して呼び出されるハンドラーを添付できません。 代わりに、コードを使用して、AddHandler(RoutedEvent, Delegate, Boolean)handledEventsToo オーバーロードを呼び出す必要があります。

注意

XAML で同じイベントのイベント ハンドラーを指定する場合は、Visual Basic コードで Handles 構文を使用しないでください。 この場合、イベント ハンドラーが 2 回呼び出されます。

WPF で "ハンドル" 機能を実装する方法

Extensible Application Markup Language (XAML) ページがコンパイルされると、中間ファイルによって、 プロパティ セット (または宣言されている Namex:Name Directive) を持つページ上のすべての要素に対して FriendWithEvents 参照を宣言します。 名前付きインスタンスはそれぞれ、Handles を介してハンドラーに割り当てることができる要素である可能性があります。

注意

Visual Studio 内で、IntelliSense には、ページ内の Handles 参照に使用できる要素の補完を表示できます。 ただし、中間ファイルですべての Friends 参照を設定できるようにするには、1 つのコンパイルの成功が必要になる場合があります。

関連項目