WPF中的类监听器和实例监听器之间有什么区别?

Urb*_*Esc 8 .net c# wpf routed-events

我试图围绕一些WPF特定的东西,并且尚未找到UIElement.AddHandler方法和EventManager.RegisterClassHandler方法之间的具体关系.

我已经google了一下,发现了这篇有趣的MSDN文章:

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

这里说明:

"路由事件考虑事件的两种不同类型的侦听器:类侦听器和实例侦听器.类侦听器存在,因为类型在其静态构造函数中调用了特定的EventManager API,RegisterClassHandler,或者从元素库中重写了类处理程序虚方法实例监听器是特定的类实例/元素,其中通过调用AddHandler为该路由事件附加了一个或多个处理程序.

好了,所以我知道一个类和它的实例之间的区别,但不知何故,我无法理解文档的这个特定部分.

任何人都可以为我清楚吗?

Jar*_*rek 11

我不知道,你究竟想知道什么.事情非常简单:您可以在实例(对象)级别或类级别注册处理程序.

不同之处在于,当您在类级别注册事件时,它将在任何实例级别处理程序之前被调用(当然,如果处理类在逻辑树中处理类较低/较高,则之前仍然会发生隧道或冒泡).因此,您可以在类级别处理此事件并过滤是否应该按实例处理此事件(通过设置e.Handled = true您将停止事件以通过其他处理程序).在某些情况下它可能很有用,但是现在我没有在脑海中分享的例子.

此示例将注册仅在为特定元素实例引发事件时才会调用的事件处理程序:

DockPanel panel = new DockPanel();
panel.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click));
Run Code Online (Sandbox Code Playgroud)

这将创建事件处理程序,每次调用DockPanelButton.Click事件时都将调用它,之后DockPanel将调用此实例处理程序:

EventManager.RegisterClassHandler(typeof(DockPanel),
    Button.ClickEvent, new RoutedEventHandler(ButtonClass_Click));
Run Code Online (Sandbox Code Playgroud)

如果方法是:

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");
}
Run Code Online (Sandbox Code Playgroud)

这将创建输出:

类级别处理程序
实例级别处理程序

但是如果在类级别处理程序中你将事件args设置为handeled(e.Handled = true;),它会过滤掉这个事件,例如级别处理程序(并在逻辑树中冒泡).