WPF事件

普通CLR事件

事件的擁有者:即消息的發(fā)送者。事件的宿主可以在某些條件下激發(fā)它擁有的事件辰妙,事件被觸發(fā)則消息被發(fā)送蚊荣。

事件的響應(yīng)者:即消息的接收者、處理者榔至。事件接收者使用其事件處理器(EventHandler)對事件做出響應(yīng)。

事件的訂閱關(guān)系:事件的擁有者可以隨時激發(fā)事件欺劳。

普通的CLR事件通過事件訂閱將事件的發(fā)布者與事件的訂閱者緊密聯(lián)系在一起唧取,事件被觸發(fā)時,事件發(fā)布者通過事件訂閱將事件消息直接發(fā)送給事件訂閱者划提,事件訂閱者使用事件處理方法對事件的發(fā)生進(jìn)行響應(yīng)枫弟;

路由事件

路由事件是一種可以針對元素樹中的多個偵聽器而不是僅僅針對引發(fā)該事件的對象調(diào)用處理程序的事件,也就是說鹏往,觸發(fā)事件源的父級或子級如果都有對該事件的監(jiān)聽淡诗,則都能觸發(fā)事件。

路由事件與一般事件的區(qū)別在于:路由事件是一種用于元素樹的事件伊履,當(dāng)路由事件觸發(fā)后韩容,它可以向上或向下遍歷可視樹和邏輯樹,他用一種簡單而持久的方式在每個元素上觸發(fā)唐瀑,而不需要任何定制的代碼群凶。

邏輯樹和可視樹

邏輯樹:WPF界面元素的實際構(gòu)成,它是由程序在XAML中所有的UI元素組成哄辣。最顯著的特點就是由布局控件请梢、或者其他常用的控件組成。

可視化樹:可以說可視樹是邏輯樹的拓展柔滔,就是在界面上能夠看見的溢陪,布局、控件的內(nèi)部構(gòu)成情況睛廊。

簡單看個例子:

xaml代碼:



邏輯樹:


可視樹:


路由事件使用以下三種路由策略

冒泡:調(diào)用事件源上的事件處理程序形真。然后,路由事件路由到連續(xù)的父元素超全,直到到達(dá)元素樹的根咆霜。大多數(shù)路由事件都使用冒泡路由策略。

直接:只有源元素本身才有機(jī)會調(diào)用處理程序作為響應(yīng)嘶朱。

隧道:最初蛾坯,將調(diào)用元素樹根目錄處的事件處理程序。然后疏遏,路由事件沿著路徑沿連續(xù)的子元素行進(jìn)脉课,到達(dá)作為路由事件源的節(jié)點元素(引發(fā)路由事件的元素)救军,通常隧道事件也稱為"preview"事件。

冒泡跟隧道的路由策略倘零,通常如果在開發(fā)的時候不讓其繼續(xù)沿著可視樹和邏輯樹再向上/向下傳遞時候唱遭,可以將其截斷,設(shè)置handle=true呈驶,這樣就會停止傳遞事件拷泽,終止在這個控件中。

自定義路由事件? ??

創(chuàng)建自定義路由事件大體可以分為三個步驟:

(1)聲明并注冊路由事件

(2)為路由事件添加CLR事件包裝

(3)創(chuàng)建可以激發(fā)路由事件的方法


首先是新建了一個類袖瞻,該類派生自RoutedEventArgs類司致,RoutedEventArgs類包含與路由事件相關(guān)的狀態(tài)信息和事件數(shù)據(jù),再新建了兩個屬性聋迎。


注冊定義路由事件通過RoutedEvent RegisterRoutedEvent注冊聲明脂矫。

第一個參數(shù)是為注冊路由事件的名稱,這個名稱不可以為空或者空字符串砌庄。

第二個參數(shù)是代表路由事件的策略羹唠,冒泡/隧道/直達(dá)之一。

第三個參數(shù)與第四個參數(shù)的類型均為Type娄昆。其中:第三個參數(shù)指定事件處理器的類型,第四個參數(shù)指定路由事件的宿主類型缝彬。本例中的事件處理器類型為EventHandler<DetailReportEventArgs>萌焰,所以第三個傳入?yún)?shù)為typeof(EventHandler<DetailReportEventArgs>)。路由事件的宿主為DetailReportButton?類谷浅,所以第四個傳入?yún)?shù)為typeof(DetailReportButton)扒俯。


通過add和remove去訂閱事件和取消事件,就類似與"+="和"-="一疯。


路由事件的觸發(fā)在OnClick方法中完成撼玄,方法中先實例化DetailReportEventArgs?類,得到對象args墩邀,并為args的EventPublisher與EventTime屬性賦值掌猛,這樣就創(chuàng)建了攜帶有路由事件相關(guān)信息的對象。然后調(diào)用?RaiseEvent方法把事件消息發(fā)送出去眉睹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荔茬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子竹海,更是在濱河造成了極大的恐慌慕蔚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斋配,死亡現(xiàn)場離奇詭異孔飒,居然都是意外死亡灌闺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門坏瞄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菩鲜,“玉大人,你說我怎么就攤上這事惦积〗有#” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵狮崩,是天一觀的道長蛛勉。 經(jīng)常有香客問我,道長睦柴,這世上最難降的妖魔是什么诽凌? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮坦敌,結(jié)果婚禮上侣诵,老公的妹妹穿的比我還像新娘。我一直安慰自己狱窘,他們只是感情好杜顺,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蘸炸,像睡著了一般躬络。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搭儒,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天穷当,我揣著相機(jī)與錄音,去河邊找鬼淹禾。 笑死馁菜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铃岔。 我是一名探鬼主播汪疮,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼德撬!你這毒婦竟也來了铲咨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蜓洪,失蹤者是張志新(化名)和其女友劉穎纤勒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隆檀,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡摇天,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年粹湃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泉坐。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡为鳄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腕让,到底是詐尸還是另有隱情孤钦,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布纯丸,位于F島的核電站偏形,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏觉鼻。R本人自食惡果不足惜俊扭,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坠陈。 院中可真熱鬧萨惑,春花似錦、人聲如沸仇矾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽若未。三九已至朱嘴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粗合,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工乌昔, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留隙疚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓磕道,卻偏偏與公主長得像供屉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子溺蕉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的疯特。 ??事件哗魂,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評論 1 11
  • 本篇博客源地址 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件ele.click()ele.click(ha...
    ZombieBrandg閱讀 674評論 0 1
  • #1. 委托1.1 聲明委托1.2 使用委托1.3 簡單委托示例1.4 Action<T>和Func<T>委托1....
    MrDecoder閱讀 669評論 0 2
  • 第1章 鼠標(biāo)事件 1-1 jQuery鼠標(biāo)事件之click與dbclick事件 用交互操作中录别,最簡單直接的操作就是...
    mo默22閱讀 1,278評論 0 6
  • 總結(jié): 鼠標(biāo)事件 1.click與dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r閱讀 1,605評論 2 10