1.问题的一部分: 这两个活动注册有什么区别?
_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown));
_popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown);
2.问题的一部分: 或最终与
popUp.Opened += PopUp_Opened;
答案 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一样继承类控件,这将非常有用。