私には分かりませんが、正確に何を知りたいですか?状況は非常に単純です:インスタンス(オブジェクト)レベルまたはクラスレベルでハンドラを登録することができます。
違いは、クラスレベルでイベントを登録すると、インスタンスレベルのハンドラ(論理ツリー内でクラスの処理が低い/高い場合は、以前はトンネリングまたはバブリングが行われています)が呼び出される前にまず呼び出されます。したがって、クラスレベルでこのイベントを処理し、このイベントをインスタンス別に処理するかどうかをフィルタリングできます(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するイベント引数を設定するならば、それはフィルタリングしますこのイベントをインスタンスレベルのハンドラ(および論理ツリーでバブリング)する。
これはまさに私が知りたいと思っていたことと文章 "これは、DockPanelがButton.Clickイベントを取得するたびに呼び出されるイベントハンドラを作成します..." :) – UrbanEsc
私はいつも助けて嬉しいです:) – Pako