路由事件的RoutedEventArgs有一個Handled屬性,當接收方將Handled屬性設定為True時,該事件則被標記為已處理,事件來源將不再發送事件。事實上,事件依然被發送,因為WPF中的很多核心組件都依靠路由事件在Visual Tree上轉來轉去。只不過已處理事件不會觸發預設事件處理方法。本文則討論怎樣註冊一個可以處理“已處理路由事件”的事件處理方法(EventHandler)。
第一種方法是UIElement.AddHandler。注意IInputElement介面定義了標準方法AddHandler:
void AddHandler(RoutedEvent routedEvent, Delegate handler);
而UIElement繼承IInputElement不僅又上述方法,還提供另一個重載:
public void AddHandler(RoutedEvent routedEvent, Delegate handler, bool handledEventsToo);
這第三個參數handledEventsToo為True的話,便可以處理已處理事件了。
比如:
button.AddHandler(Button.ClickEvent, (RoutedEventHandler)button_Click);
其次還有一種方法就是XAML中的EventSetter,它有一個HandledEventsToo屬性。但是這個屬性不能在XAML中設定,只呢通過代碼設定(解釋在這裡:http://msdn.microsoft.com/zh-cn/library/system.windows.eventsetter.handledeventstoo.aspx),而且這個屬性還有[EditorBrowsable(EditorBrowsableState.Never)]的特性聲明,所以Visual Studio成員列表中都看不到該屬性。
還是推薦用第一種方法,第二種方法太麻煩了。
參考代碼:
var style = new Style(typeof(Button));
var setter = new EventSetter(Button.ClickEvent, (RoutedEventHandler)button_Click);
setter.HandledEventsToo = true;
button.Style = style;