Wpf-routed-events
WPF-ルーティングイベント
- ルーティングイベント*は、イベントを発生させたオブジェクトだけでなく、要素ツリー内の複数のリスナーでハンドラーを呼び出すことができるイベントのタイプです。 基本的に、Routed EventクラスのインスタンスによってサポートされるCLRイベントです。 WPFイベントシステムに登録されます。 RoutedEventsには、次の3つの主なルーティング戦略があります-
- 直接イベント
- バブリングイベント
- トンネルイベント
直接イベント
直接イベントは、イベントが発生した要素によって発生するWindowsフォームのイベントに似ています。
標準のCLRイベントとは異なり、直接ルーティングイベントはクラス処理をサポートし、カスタムコントロールのスタイル内のイベントセッターおよびイベントトリガーで使用できます。
直接イベントの良い例は、MouseEnterイベントです。
バブリングイベント
バブリングイベントは、イベントが発生した要素で始まります。 次に、ビジュアルツリーを上に移動して、ビジュアルツリーの最上位の要素に移動します。 したがって、WPFでは、最上位の要素はウィンドウである可能性が高いです。
トンネルイベント
要素ツリールートのイベントハンドラーが呼び出され、イベントが発生した要素に到達するまで、イベントはビジュアルツリーを下ってすべての子ノードに移動します。
バブリングイベントとトンネリングイベントの違いは、トンネリングイベントは常にプレビューから始まるということです。
WPFアプリケーションでは、イベントは多くの場合、トンネリング/バブリングのペアとして実装されます。 したがって、プレビューMouseDownがあり、次にMouseDownイベントがあります。
以下は、ボタンと3つのテキストブロックがいくつかのプロパティとイベントで作成されるルーティングイベントの簡単な例です。
Button、StackPanel、およびWindowのClickイベント実装のC#コードを次に示します。
上記のコードをコンパイルして実行すると、次のウィンドウが生成されます-
ボタンをクリックすると、以下に示すように、テキストブロックが更新されます。
特定のレベルでルーティングイベントを停止する場合は、e.Handled = true;を設定する必要があります。
以下に示すように StackPanel_Click イベントを変更しましょう-
ボタンをクリックすると、クリックイベントがウィンドウにルーティングされず、stackpanelで停止し、3 ^ rd ^テキストブロックが更新されないことがわかります。
カスタムルーティングイベント
- ルーティングイベントを宣言し、システムコールRegisterRoutedEventで登録します。
- ルーティング戦略、つまり バブル、トンネル、またはダイレクト。
- イベントハンドラを提供します。
カスタムルーティングイベントの詳細を理解するための例を見てみましょう。 以下の手順に従ってください-
- WPFCustomRoutedEventを使用して新しいWPFプロジェクトを作成する
- ソリューションを右クリックして、[追加]> [新しいアイテム]を選択します。
- 次のダイアログが開きます。カスタムコントロール(WPF)*を選択し、名前を *MyCustomControl にします。
- [追加]ボタンをクリックすると、2つの新しいファイル(Themes/Generic.xamlおよびMyCustomControl.cs)がソリューションに追加されます。
次のXAMLコードは、Generic.xamlファイルでカスタムコントロールのスタイルを設定します。
以下は、カスタムコントロールのカスタムルーティングイベントクリックが作成される* Controlクラス*を継承する* MyCustomControlクラス*のC#コードです。
ユーザーがクリックするとメッセージボックスを表示するC#のカスタムルーティングイベントの実装を次に示します。
ルーティングイベントClickを使用してカスタムコントロールを追加するMainWindow.xamlの実装を次に示します。
上記のコードをコンパイルして実行すると、カスタムコントロールを含む次のウィンドウが生成されます。
カスタムコントロールをクリックすると、次のメッセージが生成されます。