Visual Basic .NET でコーディングする場合は、言語固有の Handles キーワードを使用して、イベント ハンドラーをオブジェクトにアタッチできます。 オブジェクトには、分離コード内のインスタンスまたは拡張アプリケーション マークアップ言語 (XAML) の要素を指定できます。
Handles は、共通言語ランタイム (CLR) イベントまたは Windows Presentation Foundation (WPF) ルーティング イベントのイベント ハンドラーを割り当てるために使用できます。 ただし、ルーティング イベントのイベント ハンドラーをアタッチするために使用する場合、 Handles にはいくつかの使用 制限 があります。
[前提条件]
この記事では、ルーティング イベントに関する基本的な知識と、 ルーティング イベントの概要を読んだことを前提としています。 この記事の例に従うと、拡張アプリケーション マークアップ言語 (XAML) に慣れている場合や、Windows Presentation Foundation (WPF) アプリケーションを記述する方法を理解している場合に役立ちます。
構文
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 ステートメントの順序は、イベントが発生したときにハンドラーが呼び出される順序を決定しません。
ヒント
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を使用して、基底クラスClickButtonBaseルーティング イベントを発生させるボタンにClickイベント ハンドラーをアタッチできます。 ただし、 ルーティング イベント の機能の 1 つは、要素ツリーを走査することです。これにより、イベントを発生させた要素よりも高いレベルでClickイベントをリッスンして処理できます。 親要素がリッスンして処理するルーティング イベントは、 添付イベントと呼ばれます。Handles構文では、イベントを発生させた要素とは異なるリスナーを XAML 要素ツリーで指定することはサポートされていないため、添付イベントには使用できません。 添付イベントのイベント ハンドラーを割り当てるには、XAML 属性構文または AddHandler メソッドを使用する必要があります。 添付イベントの詳細については、「 添付イベントの概要 」および「 WPF の添付イベント」を参照してください。Handles構文では、 Handled イベントのイベント ハンドラー呼び出しはサポートされていません。Handledイベントに対してイベント ハンドラーを呼び出せるようにするには、AddHandler(RoutedEvent, Delegate, Boolean) メソッドを使用してイベント ハンドラーをアタッチし、そのhandledEventsTooパラメーターをtrueに設定します。
こちらも参照ください
.NET Desktop feedback