UIElement.AddHandler()vs .Event + = Definition

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

_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown)); _popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown); 

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

 popUp.Opened += PopUp_Opened; 

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

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

如您所见,它为您调用UIElement.AddHandler

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

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

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