2011-02-05 6 views
8

私はいくつかのWPF固有のものの周りに頭を抱えようとしており、UIElement.AddHandlerメソッドとEventManager.RegisterClassHandlerメソッドの具体的な関係をまだ見つけていません。WPFのクラスリスナーとインスタンスリスナーの違いは何ですか?

私は少しググとこの興味深いMSDNの記事を見つけました:

http://msdn.microsoft.com/en-us/library/ms747183.aspx

ここでは述べている:

「ルーティングイベントは、イベントへのリスナーの二種類を検討:クラスリスナーとインスタンスをクラスリスナーは、型が特定のEventManager API、RegisterClassHandlerを静的コンストラクターで呼び出すか、要素基本クラスからクラスハンドラー仮想メソッドをオーバーライドしているために存在します。 AddHandlerの呼び出しによってそのルーティングイベントのために接続されています。 "

今、私はクラスとそのインスタンスの違いを知っていますが、何とか私はドキュメントのこの特定の部分を理解できません。

誰でも私のためにそれをクリアすることはできますか?

答えて

11

私には分かりませんが、正確に何を知りたいですか?状況は非常に単純です:インスタンス(オブジェクト)レベルまたはクラスレベルでハンドラを登録することができます。

違いは、クラスレベルでイベントを登録すると、インスタンスレベルのハンドラ(論理ツリー内でクラスの処理が低い/高い場合は、以前はトンネリングまたはバブリングが行われています)が呼び出される前にまず呼び出されます。したがって、クラスレベルでこのイベントを処理し、このイベントをインスタンス別に処理するかどうかをフィルタリングできます(e.Handled = trueを設定すると、他のハンドラを経由するイベントが停止します)。いくつかのケースでは役に立つかもしれませんが、今は分かち合うための例はありません。

イベントは要素の特定のインスタンスのために提起された場合にのみ呼び出されるイベントハンドラを登録します。このサンプル:ボタンを取得しますたびに任意のDockPanel呼ばれる

DockPanel panel = new DockPanel(); 
panel.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click)); 

そして、これが作成するイベントハンドラ、

EventManager.RegisterClassHandler(typeof(DockPanel), 
    Button.ClickEvent, new RoutedEventHandler(ButtonClass_Click)); 

方法があった場合::

この DockPanelのインスタンスハンドラが呼び出されます前に.Clickイベント、 10

private void ButtonClass_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Class level handler"); 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Debug.Write("Instance level handler"); 
} 
この作成することになり、出力:

クラスレベルハンドラ
インスタンスレベルハンドラ

しかし、クラスレベルのハンドラで使用すると、(e.Handled = true;)をhandeledするイベント引数を設定するならば、それはフィルタリングしますこのイベントをインスタンスレベルのハンドラ(および論理ツリーでバブリング)する。

+0

これはまさに私が知りたいと思っていたことと文章 "これは、DockPanelがButton.Clickイベントを取得するたびに呼び出されるイベントハンドラを作成します..." :) – UrbanEsc

+0

私はいつも助けて嬉しいです:) – Pako

関連する問題