2010-01-27 29 views
11

1.st部分問題: 這兩個事件註冊有什麼區別?問題的UIElement.AddHandler()vs .Event + =定義

_popUp.AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(PopUp_PreviewMouseLeftButtonDown)); 

_popUp.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(_popUp_PreviewMouseLeftButtonDown); 

2.nd部分: 或最終與

popUp.Opened += PopUp_Opened; 

回答

10

Redgate's Reflector,沒有任何區別。兩種方法最終都會調用內部方法EventHandlerStore.AddRoutedEventHandler。這是add訪問的反射器輸出爲PreviewMouseLeftButtonDown事件(在類UIElement):

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

正如你可以看到它爲你調用UIElement.AddHandler

在您編輯問題之前,您問的是彈出窗口的Opened事件。在這種情況下,有一個區別:首先,Opened事件不是作爲路由事件實現的,而是作爲一個簡單事件實現的,因此您甚至不能使用它的AddHandler調用。其次,反射器顯示在EventHandlerStore中調用了不同的方法,該方法將處理程序添加到簡單的委託集合中。

5

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

如果您使用true那麼您可以捕獲已經處理的事件,如果您繼承了像TextBox這樣的控件,這會非常有用。