WPF基礎之路由事件(二)

路由事件處理程序和XAML

若要使用XAML爲某個事件添加處理程序,請將該事件的名稱聲明爲用作事件偵聽器的元素上的屬性。該屬性的值是所實現的處理程序方法的名稱,該文件必須存在於代碼隱藏文件的分部類中。

<Button Click="blSetColor">button</Button>

用來添加標準CLR事件處理程序的XAML語法與用來添加路由事件處理程序的語法相同,因爲您實際上是在向下面具有路由事件實現的CLR事件包裝中添加處理程序。

路由策略

路由事件使用以下三個路由策略之一

冒泡:針對事件源調用事件處理程序。路由事件隨後會路由到後續的父元素,直到到達元素樹的根。大多數路由事件都使用冒泡路由策略。冒泡路由事件通常用來報告來自不同控件或其他UI元素的輸入或狀態變化。

直接:只有源元素本身才有機會調用處理程序以進行響應。這與Windows窗體用於事件的“路由”相似。但是,與標準CLR事件不同的是,直接路由事件支持類處理而且可以由EventSetter和EventTrigger使用。

隧道:最初將在元素樹的根處調用事件處理程序。隨後,路由事件將朝着路由事件的源節點元素(即引發路由事件的元素)方向,沿路由線路傳播到後續的子元素。在合成控件的過程中通常會使用或處理隧道路由的事件,這樣,就可以有意地禁止顯示覆合部件中的事件,或者將其替換爲特定於整個控件的事件。在WPF中提供的輸入事件通常是以隧道/冒泡對實現的。隧道事件有時又稱作Preview事件,這是由隧道/冒泡對所使用的命名約定決定的。

爲什麼使用路由事件?

作爲應用程序開發人員,您不需要始終了解或關注正在處理的事件是否作爲路由事件實現。路由事件具有特殊的行爲,但是,如果您在引發該行爲的元素上處理事件,則該行爲通常會不可見。

如果您使用以下任一建議方案,l路由事件的功能將得到充分發揮:在公用根處定義公用處理程序、合成自己的控件或定義您自己的自定義控件類。

路由事件偵聽器和路由事件源不必在其層次結構中共享公用事件。任何UIElement或ContentElement可以是任一路由事件的事件偵聽器。因此,您可以使用在整個工作API集內可用的全套路由事件作爲概念“接口”,應用程序中的不同元素憑藉這個接口來交換事件信息。路有事件的這個“接口”概念特別適用於輸入事件。

路由事件還可以用來通過元素樹進行通信,因爲事件的事件數據會永存到路由中的每個元素中。一個元素可以更改事件中的某項內容,該更改將對於路由中的下一個元素可用。

之所以將任何給定的WPF事件作爲路由事件的實現(而不是作爲標準CLR事件實現),除了路由方面的原因,還有兩個其他原因。如果您要實現自己的事件,則可能也需要考慮這兩個因素:

某些WPF樣式和模板功能(eg.EventSetter、EventTrigger)要求所引用的事件是路由事件。

路由事件支持類處理機制,類可以憑藉該機制來指定靜態方法,這些靜態方法能夠在任何已註冊的實例程序訪問路由事件之前,處理這些路由事件。這在控件設計中非常有用,因爲您的類可以強制執行事件驅動的行爲,以防它們在處理實例上的事件時被意外禁止。

實在看不下去了,感冒頭暈腦脹的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章