WPF:處理標記為已處理的路由事件

來源:互聯網
上載者:User

路由事件的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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.