WPF入門(二) 初遇RoutedEvent

2021-07-04 14:01:18 字數 2952 閱讀 2039

先做個簡單的東西吧,新建個wpf專案,拖動乙個menu控制項到窗體裡。使用設計器新增幾個選單子項,並雙擊選單註冊事件,**如下:

1<

window x:class="

"2xmlns="

"3xmlns:x="

"4title="

winmain

"height="

494"

width="

715"

>

5<

grid

>

6<

grid.columndefinitions

>

7<

columndefinition width="

371*

"/>

8<

columndefinition width="

344*

"/>

9grid.columndefinitions

>

10<

menu height="

25"name="

menu1

"verticalalignment="

top"

grid.columnspan="

2">

11<

menuitem header="

第一級選單

"click="

menuitem_click

">

12<

menuitem header="

第二級選單1

"/>

13<

menuitem header="

第二級選單2

"/>

14menuitem

>

15menu

>

16grid

>

17window

>

1819

20///

21///

winmain.xaml 的互動邏輯

22///

23public

partial

class

winmain : window

2429

30private

void

menuitem_click(

object

sender, routedeventargs e)

314142}

我們重點看節點menu和menuitem,menu是選單的根節點。header屬性是選單的標題。(順便說一句,在winform裡這些都是設定屬性"text"的,而在wpf裡,大多變成"content"屬性)。而讓人驚訝的是 「在**設計器中,我們只能對一級選單註冊事件」,檢視**第11行裡。有句「click=

"menuitem_click

"」 熟悉 html人都能明白這個意思,就是註冊乙個事件,事件名字是「menuitem_click」,而事件的實現**當然是在"codebehind"**後置檔案裡找了。這裡 「二級選單1」和「二級選單2」兩個選單的單擊都會觸發"menuitem_click"。也就是說「子控制項裡的單擊 觸發了 父控制項裡註冊的事件」。其實是個 「事件路由(routedevent)」,流程如下:

1.先觸發子控制項的click事件,(本示例沒有訂閱該事件,等下我們做個訂閱嘗試)。

2.再觸發父控制項的click事件。

3.依次再觸發該控制項的上一級父控制項的事件。

這裡就有了事件 觸發策略問題。即事件如何傳遞。

我們看下 註冊事件的** private

void

menuitem_click(

object

sender, routedeventargs e) ,方法簽名裡和我們常見的方法簽名區別是這個這個引數routedeventargs ,該引數屬性有(摘自msdn):

名稱說明

handled

獲取或設定乙個值,該值指示路由事件在路由過程中的事件處理當前狀態。

originalsource

在父類進行任何可能的 source 調整之前,獲取原始報告源(由純粹命中測試確定)。

routedevent

獲取或設定與此 routedeventargs 例項關聯的 routedevent。

source

獲取或設定對引發事件的物件的引用。

我們在事件中,如果想終止該事件的繼續傳遞,設定e.handled= true就可以了。

事件使用的委託的方法簽名如下:

public

delegate

void

routedeventhandler(

object

sender,

routedeventargs

e)

實際上一切都是由routedevent 物件來管理的。也就是說。routedevent處理了事件的傳遞方式。
名稱說明

handlertype

獲取路由事件的處理程式型別。

name

獲取路由事件的標識名稱。

ownertype

獲取路由事件的已註冊所有者型別。

routingstrategy

獲取路由事件的路由策略。

public

enum

routingstrategy 路由策略的列舉型別如下:

成員名稱

說明tunnel

路由事件使用隧道策略,以便事件例項通過樹向下路由(從根到源元素)。

bubble

路由事件使用冒泡策略,以便事件例項通過樹向上路由(從事件元素到根)。

direct

路由事件不通過元素樹路由,但支援其他路由事件功能,例如類處理、

eventtrigger

或 eventsetter

。我們可以設定我們routedevent的傳遞方式,當然這要自己寫控制項的時候才用得到。

稍候待續...

初遇設計模式

今天開始學設計模式了。用的是程杰老師寫的 大話設計模式 在網上搜了一下這位老師的資料,簡單的了解一下這位大牛。那麼什麼是設計模式?design pattern 設計模式 design pattern 是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。使用設計模式是為了可重用 讓 更容易...

1 初遇貪心

以題著手,先上題。題意大致為,n堆果子,每一次合併兩堆果子為一堆,消耗的體力等於兩堆果子的重量之和。直到經過 n 1 次合併之後,就只剩下一堆了,要求消耗體力最少。例如有 3堆果子,數目依次為 1,2,9。可以先將 1 2堆合併,新堆數目為3,耗費體力為3 接著,將新堆與原先的第三堆合併,又得到新的...

初遇C語言

壹 知識總結 第二章 c資料型別 1 int定義整數量 float定義單精度浮點數量 double定義雙精度浮點數量 char定義字元型量。2 讀程式都要從main 入口,然後從最上面順序往下讀 碰到迴圈做迴圈,碰到選擇做選擇 有且只有乙個main函式。3 注釋不可以巢狀,如int a 1,int ...