2009-09-22 19 views
62

私はすべての要素がイベントKeyDownとPreviewKeyDownを持っているように、 "プレビュー******"というイベントの説明を探していました。違いは何ですか(付属のイベントではなく、実際の従来の違いとプログラミングの違いです)WPFプレビューイベントとは何ですか?

Controlから派生したどのクラスでも、両方のメソッドをオーバーライドすることができます.. OnKeyDownとOnPreviewKeyDown、私のカスタムコントロール、どのメソッドを使用しますか?そして、両者の違いは何ですか?

答えて

105

- 1つのトンネリングおよびその他の バブリング - クリス・販売しており、イアン・グリフィス、直接イベントを除き

は、 WPFは ペアで最もルーティングイベントを定義します。トンネリングイベント名 は常に「プレビュー」で始まり、 が最初に呼び出されます。これにより、親に のチャンスが届いてから、 に到着することがあります。これに続いて、バブリングカウンターパートである が続きます。 の場合は、 のバブリングのみを処理します。プレビューは 通常

  • ブロックハンドリング通常のイベントに事前に何かをする親原因イベント(e.Handled = true
  • に使用されます。

UIツリー=ボタンにグリッドが含まれている場合キャンバスに楕円が含まれている場合
楕円をクリックすると(MouseDownButtonがボタンで食べられ、クリックが発生します。)

PreviewMouseDownButton 
PreviewMouseDownGrid 
PreviewMouseDownCanvas 
PreviewMouseDownEllipse 
MouseDownEllipse 
MouseDownCanvas 
MouseDownGrid 
+0

ありがとう、私はMSDNで全面的に見てきましたが、それを見つけることができませんでした。私は誰もがバブリングとトンネリングについて話しましたが、テキストのこの部分はどこにもありませんでした。 –

3

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

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

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

あなたのコントロールでは、OnKeyDownイベントに必要な主な作業を行い、他の誰かが使用するためのプレビューイベントを残しておけば、どのようにそれらを操作するのですか?

7

私は違いを説明するのに本当に便利な、このブログのエントリを見つけた:、あなたがビジュアルツリーを持って

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

イベントは、ツリー内の要素に発生したときに、最初のプレビューイベントから移動します要素へのルート(トンネリング):これらすべての要素でPreviewKeyDownイベントが発生し、要素からルート(バブリング)に「通常の」イベントが移動します。プログラミングWPFから

3

この違いは、WPFがイベント処理戦略をどのように実装するかというルーティングイベントと関係があります。標準イベント名(KeyDownなど)は、バブリングルーティング戦略を意味します。プレビュー(PreviewKeyDownなど)が付加されたプレフィックスは、トンネリングルーティング戦略を意味します。これらの戦略については、hereで詳しく読むことができます。基本的には、WPFのイベントが呼び出されると、最初にビジュアルツリーの一番上の要素からイベントを呼び出す要素に移動し、最後に上に戻ります。ツリーの途中で、PreviewKeyDownイベントが発生し、帰りに、KeyDownイベントがこの順序で発生します。