web-dev-qa-db-ja.com

WPFプレビューイベントとは何ですか?

すべての要素にイベントKeyDownおよびPreviewKeyDownがあるように、イベント「Preview ******」の説明を探しています。違いは何ですか(1つはイベントに接続されているが、もう1つは接続されていない、実際の従来の違いとプログラミング方法の違い)

Controlから派生した任意のクラスで、両方のメソッドをオーバーライドできます。そして、それらの両方の違いは何ですか。

72
Akash Kava

プログラミングWPFから-Chris SellsとIan Griffith

直接的なイベントを除き、WPFはほとんどのルーティングイベントをペアで定義します-1つはトンネリングで、もう1つはバブリングです。トンネリングイベント名は常に「プレビュー」で始まり、最初に発生します。これにより、親はイベントが子供に届く前にイベントを見ることができます。これに続いて、バブリングのカウンターパートが続きます。ほとんどの場合、泡立つものだけを処理します。通常、プレビューは次の目的で使用されます。

  • イベントをブロックする(e.Handled = true
  • 親に通常のイベント処理に先立って何かをさせます。

例えばUIツリー=ボタンにグリッドが含まれ、キャンバスに楕円が含まれる場合
楕円をクリックすると、(MouseDownButtonがButtonによって食べ尽くされ、代わりにClickが発生します。)

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid
114
Gishu

このブログのエントリは、違いを説明するのに非常に役立ちました。

http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

視覚的なツリーがあり、イベントがツリーの要素で発生すると、最初にプレビューイベントがルートから要素に移動します(トンネリング)。これらすべての要素でPreviewKeyDownイベントが発生し、次に「通常」イベントは要素からルートに移動します(バブル)。

8
Bubblewrap

この違いはルーティングイベントに関係しています。これは、WPFがイベント処理戦略を実装する方法です。標準イベント名(つまり、KeyDownなど)は、バブリングルーティング戦略を意味します。 「Preview」(PreviewKeyDownなど)が先頭に付いているものは、トンネリングルーティング戦略を意味します。これらの戦略について詳しくは こちら をご覧ください。基本的に、WPFのイベントが呼び出されると、最初に最上位の要素からビジュアルツリーを下ってイベントを呼び出した要素に移動し、最後に上に戻ります。ツリーを下る途中でPreviewKeyDownイベントが発生し、復路ではKeyDownイベントがこの順番で発生します。

3
jturinetti

基本的に、同じイベントですが、メインイベントの直前に発生します。これらが存在するため、これらのイベントが発生したときにコントロールの通常の動作を妨げることなく、これらのタイプのイベントをリッスンできます。

たとえば、ClickやMouseEnterなどでボタンが機能します。これらのイベントを自分で処理する場合は、同じことを行う必要があります。そうしないと、ボタンは同じように動作しません。プレビューイベントは、既存の機能をいじることを心配することなく、同じタイムラインでイベントを提供します。

これは、カスタムスタイル/トリガー/コントロールテンプレートを扱う場合に特に便利です。コントロールの外観/動作のオーバーライドを開始するとき。

コントロールで、OnKeyDownイベントで必要な主な作業を行い、プレビューイベントを他の人が使用できるようにします。

3
Nick