次の方法で共有


Visual Basic と WPF のイベント処理

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 に設定します。

こちらも参照ください