Visual Basic および WPF イベント処理 (WPF .NET)
Visual Basic .NET でコーディングする場合は、言語固有の Handles キーワードを使用して、イベント ハンドラーをオブジェクトにアタッチできます。 オブジェクトには、分離コード内のインスタンスまたは拡張アプリケーション マークアップ言語 (XAML) の要素を指定できます。 Handles
を使用して、共通言語ランタイム (CLR) イベントまたは 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 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
に設定します。
関連項目
.NET Desktop feedback