1.问题的一部分:
这两个活动注册有什么区别?
_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown));
_popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown);
2.问题的一部分:
或最终与
popUp.Opened += PopUp_Opened;
根据 Redgate的反射器, 没有区别。两种方法最终都会调用内部方法 EventHandlerStore.AddRoutedEventHandler。这是反射器的输出 add 的访问者 PreviewMouseLeftButtonDown 事件(在课堂上 UIElement):
public void add_PreviewMouseLeftButtonDown(MouseButtonEventHandler value)
{
this.AddHandler(PreviewMouseLeftButtonDownEvent, value, false);
}
正如你所看到的那样 UIElement.AddHandler 为你。
在您编辑问题之前,您询问的是 Opened 弹出的事件。在这种情况下,有一个区别:第一, Opened 事件不是作为路由事件实现的,而是作为一个简单事件实现的,因此您甚至无法使用 AddHandler 打电话给它。其次,反射器显示了一种不同的方法 EventHandlerStore 它将处理程序添加到一个简单的委托集合中。
重要的可能是 AddHandler(xxx,xxx, false)。
如果你使用 true 然后你可以捕获已经处理过的事件,如果你像TextBox那样继承了类,那么这些事件会很有用。