WPF ではイベントをルーティングしました。これらは通常のイベントの代わりにいつ使用する必要がありますか?
2 に答える
ルーティング イベントには特別な動作がありますが、イベントが発生した要素でイベントを処理している場合、その動作はほとんど見えません。
ルーティング イベントが強力になるのは、推奨されるシナリオのいずれかを使用する場合です。つまり、共通のルートで共通のハンドラーを定義する、独自のコントロールを合成する、独自のカスタム コントロール クラスを定義するなどです。
ルーティング イベント リスナーとルーティング イベント ソースは、階層内で共通のイベントを共有する必要はありません。任意のUIElementまたはContentElementを任意のルーティング イベントのイベント リスナーにすることができます。したがって、アプリケーション内の異なる要素がイベント情報を交換できる概念的な "インターフェイス" として、動作中の API セット全体で利用可能なルーティング イベントの完全なセットを使用できます。ルーティング イベントのこの "インターフェイス" の概念は、特に入力イベントに適用できます。
ルーティング イベントは、要素ツリーを介した通信にも使用できます。これは、イベントのイベント データがルート内の各要素に永続化されるためです。1 つの要素がイベント データ内の何かを変更する可能性があり、その変更はルート内の次の要素で利用できます。
ルーティングの側面以外にも、特定の WPF イベントが標準の CLR イベントではなくルーティング イベントとして実装される理由が 2 つあります。独自のイベントを実装する場合は、次の原則も考慮してください。
- EventSetterやEventTriggerなどの特定の WPF スタイルおよびテンプレート機能では、参照されるイベントがルーティング イベントである必要があります。これは、前述のイベント識別子のシナリオです。
- ルーティング イベントはクラス処理メカニズムをサポートします。これにより、登録済みのインスタンス ハンドラーがルーティング イベントにアクセスする前に、ルーティング イベントを処理できる静的メソッドをクラスで指定できます。これは、インスタンスでイベントを処理することによって誤って抑制できないイベント ドリブン クラスの動作をクラスで強制できるため、コントロールの設計に非常に役立ちます。
WPF では、コントロール コンポジションが頻繁に使用されます。ほとんどの場合、一連のコントロールの構成は単一のアクティビティを公開するため、ルーティング イベントを使用することが義務付けられています。