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那样继承了类,那么这些事件会很有用。