2013-05-24 35 views

答えて

30

WPFはイベントを処理するためのさまざまなメカニズムを提供します - これらはバブリング、トンネリング、およびダイレクトです。これらはすべて ルーテッドイベントと呼ばれます。

直接イベントが

あなたはおそらくすでに直接ルーティングイベントに使用されています。これは、項目自体が発生したイベントを処理する です。良い例である は、彼がonClick - 標準の WinFormsのマウスボタンのイベントを処理するでしょう。これは、GUIアイテム内でイベントが発生し、前記GUIエレメントによって が処理される場所である。イベントバブル

は、今、私たちすべて1つのフォームまたは別のある泡が好き。バブリングは、イベントが要素(たとえば、textbox)によって処理されず、 イベントがそれを保持するUIコンテナを「バブル」するときに、 が発生します。 の例では、パネルを含むウィンドウがあり、そのパネルにはグリッドがあり、グリッド内にはテキストボックスがあることを としましょう。 イベントがテキストボックスで処理されていない場合、イベントは移動され、 グリッドレベルまで(グリッドにはテキストボックスが含まれています)、 がそのレベルで処理されずにイベントがさらに泡立ちますディスプレイに 「ツリー」(ビジュアルツリーとして知られている)を表示して、 を処理するかどうかを確認してください。このプロセスは、処理されるか、イベント が一番上の要素を "エスケープ"するまで続きます。

バブリングイベントの例は、 MouseButtonDownイベントのようなものです。またはKeydownイベント。

トンネリング

トンネリングは、バブリングの反対です。したがって、イベントの代わりに がビジュアルツリーを「上」にすると、イベントはソースと見なされる要素 に向かってビジュアルツリーを移動します。 トンネリングイベントを定義する標準のWPFの名前は、すべて「プレビュー」 (たとえばpreviewdownkeyおよびpreviewmousebuttondown)で始まるということです。 "target"要素への途中でそれらをキャッチして処理できます。 この例は、グリッド内にいくつかのコントロールを持っている可能性があります。 コントロールの中に、何かの理由でグリッドに文字「t」があることを許可する 内のコントロールがないと判断したとします。

Source私がサポートしていない、または同意しない著者の意見です。スタートとして

And another StackOverflow question which is pretty much the same.

A nice demo project

And last but not least some explanation and another tutorial.

+1

本当に良い説明、感謝+1。ところで、 "素敵なデモプロジェクト"のリンクは今や死んでいます。 – Sabuncu

2

:いくつかのデフォルトのイベントのためのWPFでの命名規則は、トンネリングおよびバブリング用<event>ためPreview<event>です。たとえば、KeyDownの場合は、トンネリングとバブリングがそれぞれPreviewKeyDownKeyDownになります。

2つの違いは、命名規則に示されているように、トンネリングイベントはツリー内の最も高いノード(おそらくウィンドウ)から開始し、最も低い子になるということです。子どもにバブリングのイベントが始まり、再び上に行く。

このガイドでは明らかにそれを説明する必要があります http://www.codeproject.com/Articles/464926/To-bubble-or-tunnel-basic-WPF-events

関連する問題