WPF基礎之路由事件(一)

2021-09-10 05:32:10 字數 2439 閱讀 4771

路由(routing)是指分組從源到目的地時,決定端到端路徑的網路範圍的程序 。

什麼是路由事件

功能定義:路由事件是一種可以針對元素樹中的多個偵聽器(而不是僅針對引發該事件的物件)呼叫處理程式的事件。

實現定義:路由事件是乙個clr事件,可以由routedevent類的例項提供支援並由windows presentation foundation(wpf)事件系統來處理。

典型的wpf應用程式中包含許多元素。無論這些元素是在**中建立的還是在xaml中宣告的,它們都是由共同所在的元素樹關聯起來。根據事件的定義,事件路由可以按兩種方向之一傳播,但是通常會在元素樹中從源元素向上「冒泡」,直到它到達元素樹的根(通常是頁面或視窗)。

請考慮下面的簡單元素樹

yes

nocancel

在這個簡單的元素樹中,click事件的源是某個button的元素,而所單擊的button事件是有機會處理該事件的第乙個元素。但是,如果附加到button的任何處理程式均未作用於該事件,則該事件將向上「冒泡」到元素樹中的button父級(即stackpanel)。該事件可能會「冒泡」到border,然後會到達元素樹的頁面根(未顯示出來)。

換言之,此click事件的事件路由為:

button-->stackpanel-->border-->...

控制項的撰寫和封裝:wpf中的各個控制項都有乙個豐富的內容模型。例如,可以將影象放在button的內部,這會有效地擴充套件按鈕的視覺化樹。但是,所新增的影象不得中斷命中測試行為(該行為會使按鈕響應對影象內容的click),即使使用者所單擊的畫素在技術上shu'yu該影象也是如此。

單一處理程式附加點:在windows窗體中,必須多次附加同乙個處理程式,才能處理可能是從多個元素引發的事件。路由事件使您可以只附加該處理程式一次(像上例中那樣),並在必要時使用處理程式邏輯來確定該事件源自何處。例如,這可以是前面顯示的xaml的處理程式:

private void commonclickhander(object sender, routedeventargs e)

e.handled = true;

}

類處理:路有事件允許使用由類定義的靜態處理程式。這個類護理程式能夠搶在任何附加的例項處理程式之前來處理事件。

引用事件,而不反射:某些**和標記技術需要能標識特定事件的方法。路有事件建立routedevent欄位作為識別符號,以此提供不需要靜態反射或執行時反射的可靠的事件標識技術。

路由事件時乙個clr事件,它由routedevent類提供支援並用wpf事件系統註冊。從註冊中獲取的routedevent例項通常保留為某種類的public static readonly欄位成員,該類進行了註冊並因此擁有路由事件。與同名clr事件(又稱包裝事件)的連線是通過重寫clr事件的add和remove實現來完成的。通常,add和remove保留為隱式預設值,該預設值使用特定於語言的相應事件語法來新增和移除該事件的處理程式。路由事件的支援和連線機制在概念上與以下機制相似:依賴項屬性是乙個clr屬性,該屬性由dependencyproperty類提供支援並用wpf屬性系統註冊。

下面的例項演示自定義tap路由事件的宣告,其中包括註冊和公開routedevent識別符號字段以及對tap clr事件進行add和remove的實現。

public static readonly routedevent tapevent = eventmanager.registerroutedevent;

//provide clr accessors for the event

public event routedeventhandler tap

remove

}

​public shared readonly tapevent as routedevent = eventmanager.registerroutedevent

'provide clr accessors for the event

public custom event tap as routedeventhandler

addhandler(byval value as routedeventhandler)

me.addhandler(tapevent, value)

end addhandler

removehandler(byval value as routedeventhandler)

me.removehandler(tapevent, value)

end removehandler

raiseevent(byval sender as object, byval e as routedeventargs)

me.raiseevent(e)

end raiseevent

end event

​​

(ps:學著wpf,突然就來一段vb的東西,一臉懵逼)

WPF基礎之路由事件 二

若要使用xaml為某個事件新增處理程式,請將該事件的名稱宣告為用作事件偵聽器的元素上的屬性。該屬性的值是所實現的處理程式方法的名稱,該檔案必須存在於 隱藏檔案的分部類中。button用來新增標準clr事件處理程式的xaml語法與用來新增路由事件處理程式的語法相同,因為您實際上是在向下面具有路由事件實...

WPF學習之路 路由事件

前景簡介 博主本人從事sdk開發,主要語言c 由於客戶需求,需要給予自己的sdk,開發一套應用,採用wpf,本人wpf小白。所以從頭開始學習wpf,主要看過了 深入遷出wpf 就開始了程式的開發,由於對於mvvm理解不深,程式框架寫的非常亂,雖然應用已經發布,但是後續擴充套件難度較大 最近研究多螢幕...

WPF路由事件

c 高階程式設計第八版閱讀筆記 sender 事件的傳送者 其呼叫的事件處理器 source事件源 激發 raise 的事件 不使用路由事件的話 sender跟source是同一物件 originalsource 也是事件源 與source不同的地方在於他是原始事件源,真正的激發事件的源頭 事件的s...