我试图围绕一些WPF特定的东西,并且尚未找到UIElement.AddHandler方法和EventManager.RegisterClassHandler方法之间的具体关系。
我已经google了一下,发现了这篇有趣的MSDN文章:
http://msdn.microsoft.com/en-us/library/ms747183.aspx
这里说明:
“路由事件考虑事件的两种不同类型的侦听器:类侦听器和实例侦听器。类侦听器存在,因为类型在其静态构造函数中调用了特定的EventManager API,RegisterClassHandler,或者从中覆盖了类处理程序虚拟方法实例侦听器是特定的类实例/元素,其中通过调用AddHandler为该路由事件附加了一个或多个处理程序。“
现在好了,所以我知道了一个类和它的实例之间的区别,但不知何故我无法理解文档的这个特定部分。
有人可以为我清楚吗?
答案 0 :(得分: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");
}
这将创建输出:
班级处理员
实例级别处理程序
但是如果在类级别处理程序中你将事件args设置为handeled(e.Handled = true;
),它会过滤掉这个事件,例如级别处理程序(并在逻辑树中冒泡)。