8

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

我搜索了一下,发现了这篇有趣的 MSDN 文章:

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

这里说:

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

好吧,现在我知道类和它的实例之间的区别,但不知何故,我无法理解文档的这个特定部分。

谁能帮我解决这个问题?

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 回答