繁体   English   中英

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

[英]What's the difference between a class listener and an instance listener in WPF?

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

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

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

这里说明:

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

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

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

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

不同之处在于,当您在类级别注册事件时,它将在任何实例级别处理程序之前被调用(当然,如果处理类在逻辑树中处理类较低/较高,则之前仍然会发生隧道或冒泡)。 因此,您可以在类级别处理此事件并过滤是否应该按实例处理此事件(通过设置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; ),它将过滤掉这个事件以用于实例级别处理程序(并在逻辑树中冒泡)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM