UIElement.AddHandler()vs .Event + = Definition

时间:2010-01-27 13:05:25

标签: c# wpf event-handling

1.问题的一部分: 这两个活动注册有什么区别?

_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown));

_popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown);

2.问题的一部分: 或最终与

popUp.Opened += PopUp_Opened;

2 个答案:

答案 0 :(得分:10)

根据Redgate's Reflector,没有区别。两种方法最终都调用内部方法EventHandlerStore.AddRoutedEventHandler。这是add事件的PreviewMouseLeftButtonDown访问者的反射器输出(在类UIElement中):

public void add_PreviewMouseLeftButtonDown(MouseButtonEventHandler value)
{
    this.AddHandler(PreviewMouseLeftButtonDownEvent, value, false);
}

您可以看到它为您调用UIElement.AddHandler

在您编辑问题之前,您询问了弹出窗口的Opened事件。在这种情况下,存在差异:首先,Opened事件未实现为路由事件,而是作为简单事件实现,因此您甚至无法对其使用AddHandler调用。其次,反射器显示在EventHandlerStore中调用了一个不同的方法,它将处理程序添加到一个简单的委托集合中。

答案 1 :(得分:5)

重要的是AddHandler(xxx,xxx, false)

如果您使用true,那么您可以捕获已经处理过的事件,如果您像TextBox一样继承类控件,这将非常有用。