C# UIElement.AddHandler()与事件+;=定义

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.问题的第

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

_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);
}