8

私はいくつかのWPF固有のものに頭を悩ませようとしていますが、UIElement.AddHandlerメソッドとEventManager.RegisterClassHandlerメソッドの間の具体的な関係をまだ見つけていません。

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

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

ここにそれは述べています:

「ルーティングされたイベントは、クラスリスナーとインスタンスリスナーの2つの異なるタイプのリスナーをイベントに考慮します。クラスリスナーは、タイプが静的コンストラクターで特定のEventManager API、RegisterClassHandlerを呼び出したか、要素ベースからクラスハンドラー仮想メソッドをオーバーライドしたために存在します。クラス。インスタンスリスナーは、AddHandlerの呼び出しによって、ルーティングされたイベントに対して1つ以上のハンドラーがアタッチされている特定のクラスインスタンス/要素です。」

さて、クラスとそのインスタンスの違いはわかっていますが、どういうわけか、ドキュメントのこの特定の部分を理解することはできません。

誰かが私のためにそれを片付けることができますか?

4

1 に答える 1

11

わかりません、正確に何を知りたいですか。物事は非常に単純です。インスタンス(オブジェクト)レベルまたはクラスレベルでハンドラーを登録できます。

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

このサンプルは、要素の特定のインスタンスに対してイベントが発生したときにのみ呼び出されるイベントハンドラーを登録します。

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

これにより、イベントハンドラーが作成されますDockPanel。このハンドラーは、Button.Clickイベントを取得するたびに呼び出され、その後、このインスタンスハンドラーがDockPanel呼び出されます。

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

メソッドが次の場合:

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");
}

これにより、出力が作成されます。

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

ただし、クラスレベルのハンドラーでイベント引数をhandeled(e.Handled = true;)に設定すると、インスタンスレベルのハンドラーでこのイベントが除外されます(論理ツリーでバブリングされます)。

于 2011-02-05T18:45:12.320 に答える