WPF路由事件

2022-03-07 05:42:18 字數 3573 閱讀 2363

(建議大家使用工具 snoop,可以到blois.us/snoop

先來了解下什麼是wpf裡的路由事件

我們建立乙個wpf應用程式,**如下:

using system.windows;

using system.windows.input;

namespace wpfceshi

private void window_mousedown(object sender, mousebuttoneventargs e)

private void grid_mousedown(object sender, mousebuttoneventargs e)

private void button_mousedown(object sender, mousebuttoneventargs e)}}

除錯執行,滑鼠右鍵點選按鈕,會依次彈出三個對話方塊。(注意一定是滑鼠右鍵,否則引發不了事件)

這裡大家也許就會問了,我點選的是按鈕,為什麼grid和window也會引發事件呢?其實這就是路由事件的機制,引發的事件由源元素逐級傳到上層的元素,button—>grid—>window,這樣就導致這幾個元素都接收到了事件。

那麼如何讓grid和window不處理這個事件呢?

我們只需要在button_mousedown這個方法中加上e.handled = true; 這樣就表示事件已經被處理,其他元素不需要再處理這個事件了。

private void button_mousedown(object sender, mousebuttoneventargs e)

這時如果我們需要grid也參與處理這個事件該怎麼做呢?我們只需要給他addhandler即可。

修改**如下

public window1()

再加上這個方法

private void grid_mousedown1(object sender, routedeventargs e)

到此大家應該對路由事件有大概的認識了吧。

上面我們看到的只是路由事件中的一種方式:氣泡。還有兩種:隧道、直接。

總結:氣泡事件最為常見,它表示事件從源元素擴散(傳播)到可視樹,直到它被處理或到達根元素。這樣您就可以針對源元素的上方層級物件處理事件。例如,您可向嵌入的 grid 元素附加乙個 button.click 處理程式,而不是直接將其附加到按鈕本身。氣泡事件有指示其操作的名稱(例如,mousedown)。

隧道事件採用另一種方式,從根元素開始,向下遍歷元素樹,直到被處理或到達事件的源元素。這樣上游元素就可以在事件到達源元素之前先行擷取並進行處理。根據命名慣例,隧道事件帶有字首 preview(例如 previewmousedown)。

直接事件類似 .net framework 中的正常事件。該事件唯一可能的處理程式是與其掛接的委託。

對於隧道事件,大家可以寫個小程式測試一下

using system.windows;

using system.windows.input;

namespace wpfceshi

private void button_previewmousedown(object sender, mousebuttoneventargs e)

private void grid_previewmousedown(object sender, mousebuttoneventargs e)

private void window_previewmousedown(object sender, mousebuttoneventargs e)}}

可以看到,隧道事件的傳遞剛好與氣泡事件相反。

文章就到這裡吧,希望對你有幫助。

(建議大家使用工具 snoop,可以到blois.us/snoop

先來了解下什麼是wpf裡的路由事件

我們建立乙個wpf應用程式,**如下:

using system.windows;

using system.windows.input;

namespace wpfceshi

private void window_mousedown(object sender, mousebuttoneventargs e)

private void grid_mousedown(object sender, mousebuttoneventargs e)

private void button_mousedown(object sender, mousebuttoneventargs e)}}

除錯執行,滑鼠右鍵點選按鈕,會依次彈出三個對話方塊。(注意一定是滑鼠右鍵,否則引發不了事件)

這裡大家也許就會問了,我點選的是按鈕,為什麼grid和window也會引發事件呢?其實這就是路由事件的機制,引發的事件由源元素逐級傳到上層的元素,button—>grid—>window,這樣就導致這幾個元素都接收到了事件。

那麼如何讓grid和window不處理這個事件呢?

我們只需要在button_mousedown這個方法中加上e.handled = true; 這樣就表示事件已經被處理,其他元素不需要再處理這個事件了。

private void button_mousedown(object sender, mousebuttoneventargs e)

這時如果我們需要grid也參與處理這個事件該怎麼做呢?我們只需要給他addhandler即可。

修改**如下

public window1()

再加上這個方法

private void grid_mousedown1(object sender, routedeventargs e)

到此大家應該對路由事件有大概的認識了吧。

上面我們看到的只是路由事件中的一種方式:氣泡。還有兩種:隧道、直接。

總結:氣泡事件最為常見,它表示事件從源元素擴散(傳播)到可視樹,直到它被處理或到達根元素。這樣您就可以針對源元素的上方層級物件處理事件。例如,您可向嵌入的 grid 元素附加乙個 button.click 處理程式,而不是直接將其附加到按鈕本身。氣泡事件有指示其操作的名稱(例如,mousedown)。

隧道事件採用另一種方式,從根元素開始,向下遍歷元素樹,直到被處理或到達事件的源元素。這樣上游元素就可以在事件到達源元素之前先行擷取並進行處理。根據命名慣例,隧道事件帶有字首 preview(例如 previewmousedown)。

直接事件類似 .net framework 中的正常事件。該事件唯一可能的處理程式是與其掛接的委託。

對於隧道事件,大家可以寫個小程式測試一下

using system.windows;

using system.windows.input;

namespace wpfceshi

private void button_previewmousedown(object sender, mousebuttoneventargs e)

private void grid_previewmousedown(object sender, mousebuttoneventargs e)

private void window_previewmousedown(object sender, mousebuttoneventargs e)}}

可以看到,隧道事件的傳遞剛好與氣泡事件相反。

文章就到這裡吧,希望對你有幫助。

WPF路由事件

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

WPF 路由事件

路由事件有三種方式。direct event 直接路由事件。自身元素,不傳遞。bubbling event 冒泡路由事件。從子元素到父元素傳遞。tunneling event 隧道路由事件。從父元素到子元素傳遞。1.設定handled true的時候,不管是冒泡還是隧道事件,它還是會繼續傳播的,只是...

WPF的路由事件

wpf中的事件為路由事件,所謂路由事件,msdn定義如下 功能定義 路由事件是一種可以針對元素樹中的多個偵聽器 而不是僅針對引發該事件的物件 呼叫處理程式的事件。實現定義 路由事件是乙個 clr 事件,可以由 routedevent 類的例項提供支援並由 windows presentation f...