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

8
我正在努力理解一些与WPF相关的内容,但是尚未找到UIElement.AddHandler方法和EventManager.RegisterClassHandler方法之间具体的关系。
我已经进行了一些谷歌搜索,并找到了这篇有趣的MSDN文章:

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

这里提到:
“路由事件考虑到事件的两种不同类型的侦听器:类侦听器和实例侦听器。类侦听器的存在是因为类型在其静态构造函数中调用了特定的EventManager API,即RegisterClassHandler,或者从元素基类覆盖了类处理程序虚拟方法。实例侦听器是特定的类实例/元素,其中通过调用AddHandler为该路由事件附加了一个或多个处理程序。”
现在我知道类和它的实例之间的区别,但是我无法理解文档中的这一部分。
有人能为我澄清吗?
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");
}

这将会产生以下输出:

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

但是如果在类级别的处理程序中设置事件参数为已处理(e.Handled = true;),它将过滤掉实例级别的处理程序(以及在逻辑树中向上冒泡的事件)。


那正是我想知道的,而且句子“这将创建事件处理程序,每当任何DockPanel获得Button.Click事件时都会调用它....”让我清楚了我的思维错误所在 :) - user604613

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接