次の方法で共有


Visual Basic および WPF イベント処理 (WPF .NET)

Visual Basic .NET でコーディングする場合は、言語固有の Handles キーワードを使用して、イベント ハンドラーをオブジェクトにアタッチできます。 オブジェクトには、分離コード内のインスタンスまたは拡張アプリケーション マークアップ言語 (XAML) の要素を指定できます。 Handles を使用して、共通言語ランタイム (CLR) イベントまたは Windows Presentation Foundation (WPF) ルーティング イベントのイベント ハンドラー割り当てることができます。 ただし、 には、ルーティング イベントのイベント ハンドラーをアタッチするときに 使用に関するいくつかの制限があります。

前提 条件

この記事では、ルーティング イベントに関する基本的な知識と、ルーティング イベントの概要読んだことを前提としています。 この記事の例に従うと、拡張アプリケーション マークアップ言語 (XAML) に慣れている場合や、Windows Presentation Foundation (WPF) アプリケーションを記述する方法を理解している場合に役立ちます。

構文

Handles キーワードを使用する Sub 宣言の構文は、Sub <procedure name> Handles <object name>.<event name>です。 この構文では、プロシージャをイベント ハンドラーとして指定します。このハンドラーは、<event name> で指定されたイベントが、<object name>で指定されたオブジェクトで発生したときに実行されます。 イベントは、オブジェクトのクラスまたは基底クラスのメンバーである必要があります。 次の例は、Handlesを使用して XAML 要素にイベント ハンドラーをアタッチする方法を示しています。

' Click event handler attached to XamlButton using Handles.
Private Sub XamlButton_Click(sender As Object, e As RoutedEventArgs) Handles XamlButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to XamlButton using Handles.")

End Sub

分離コードで定義されたオブジェクトで Handles を使用するには、通常、WithEvents キーワードを使用してオブジェクトを宣言します。 WithEvents 使用法の詳細については、次の 参照してください。 WPF は、Friend WithEventsを使用してすべての XAML 要素を自動的に宣言します。 次の例は、WithEventsを使用して分離コードで定義されたオブジェクトを宣言する方法を示しています。

' Declare a new button using WithEvents.
Dim WithEvents CodeButton As New Button With {
    .Content = "New button",
    .Background = Brushes.Yellow
}

' Click event handler attached to CodeButton using Handles.
Private Sub CodeButton_Click(sender As Object, e As RoutedEventArgs) Handles CodeButton.Click

    ' Handler logic.
    Debug.WriteLine($"Click event handler attached to CodeButton using Handles.")

End Sub

複数のイベントに同じハンドラーを使用するには、<object name>.<event name> イベントをコンマで区切ります。 たとえば、Sub Button_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click, Button2.Clickします。 コンマ区切りイベントの順序は重要ではありません。

複数の Handles ステートメントを使用して、同じイベントに対して異なるハンドラーを割り当てることができます。 Handles ステートメントの順序によって、イベントが発生したときにハンドラーが呼び出される順序は決まりません。

ヒント

で追加されたハンドラーを削除するには、RemoveHandler呼び出します。 たとえば、RemoveHandler Button1.Click, AddressOf Button1_Clickします。

WPF アプリケーションでの 'Handles' の使用

XAML で定義されたオブジェクトの場合、Handles イベント構文 <object name>.<event name> は、オブジェクトを表す XAML 要素に Name プロパティまたは x:Name プロパティが必要です。 ただし、XAML ページのルート要素には name プロパティは必要ありません。この要素には名前 Me使用できます。 次の例は、Handlesを使用して XAML ページ ルートにイベント ハンドラーをアタッチする方法を示しています。

' Loaded event handler attached to the XAML page root using Handles.
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    ' Handler logic.
    Debug.WriteLine($"Loaded event handler attached to Window using Handles.")

End Sub

XAML ページがコンパイルされると、Name パラメーターまたは x:Name パラメーターを持つすべての XAML 要素が Friend WithEventsとして宣言されます。 その結果、Handlesで任意の XAML 要素を使用できます。

アドバイス

Visual Studio IntelliSense には、Handlesで使用できるオブジェクトが表示されます。

Handles、XAML 属性構文、AddHandler ステートメント、または AddHandler メソッドを使用してイベント ハンドラーをアタッチする場合でも、イベント システムの動作は同じです。

手記

XAML 属性と Handles の両方を使用して同じイベント ハンドラーを同じイベントにアタッチしないでください。それ以外の場合、イベント ハンドラーはイベントごとに 2 回呼び出されます。

制限

Handles キーワードには、次の使用制限があります。

  • イベントがオブジェクトのクラスまたは基底クラスのメンバーである場合にのみ、Handles を使用してイベント ハンドラーをオブジェクトにアタッチできます。 たとえば、Handles を使用して、基底クラス ButtonBaseClick ルーティング イベントを発生させるボタンに Click イベント ハンドラーをアタッチできます。 ただし、ルーティング イベント の機能の 1 つは、要素ツリーを走査することです。これにより、イベントを発生させた要素よりも高いレベルで Click イベントをリッスンして処理できます。 親要素がリッスンして処理するルーティング イベントは、添付イベントと呼ばれます。 Handles 構文では、イベントを発生させた要素とは異なるリスナーを XAML 要素ツリーで指定することはサポートされていないため、添付イベントには使用できません。 添付イベントのイベント ハンドラーを割り当てるには、XAML 属性構文または AddHandler メソッドを使用する必要があります。 添付イベントの詳細については、「添付イベントの概要」 および WPFの添付イベントの に関するページを参照してください。

  • Handles 構文では、Handled イベントのイベント ハンドラー呼び出しはサポートされていません。 Handled イベントに対してイベント ハンドラーを呼び出せるようにするには、AddHandler(RoutedEvent, Delegate, Boolean) メソッドを使用してイベント ハンドラーをアタッチし、その handledEventsToo パラメーターを trueに設定します。

関連項目