C# UIElement.AddHandler()与事件+;=定义
1.问题的第一部分: 这两个事件注册之间有什么区别C# UIElement.AddHandler()与事件+;=定义,c#,wpf,event-handling,C#,Wpf,Event Handling,1.问题的第一部分: 这两个事件注册之间有什么区别 _popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown)); _popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown); 2.问题的第
_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown));
_popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown);
2.问题的第二部分:
或者最终对
popUp.Opened += PopUp_Opened;
据统计,没有区别。这两种方法最终都会调用内部方法EventHandlerStore.AddRoutedEventHandler
。这是PreviewMouseLeftButtonDown
事件(在类UIElement
中)的add
访问器的反射器输出:
如您所见,它为您调用UIElement.AddHandler
编辑问题之前,您询问的是弹出窗口的
打开事件。在这种情况下,有一个区别:首先,Opened
事件不是作为路由事件实现的,而是作为简单事件实现的,因此您甚至不能对其使用AddHandler
调用。其次,反射器显示在EventHandlerStore
中调用了一个不同的方法,该方法将处理程序添加到一个简单的委托集合。重要的事情可能是AddHandler(xxx,xxx,false)
如果使用true
,则可以捕获已处理的事件,如果将控件(如TextBox)子类化,这将非常有用
public void add_PreviewMouseLeftButtonDown(MouseButtonEventHandler value)
{
this.AddHandler(PreviewMouseLeftButtonDownEvent, value, false);
}