學習WPF路由事件

2022-03-19 17:07:47 字數 1786 閱讀 5151

(建議大家使用工具 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路由事件學習筆記

路由事件是具有更強傳播能力的事件 他們可在元素樹中向上冒泡和向下隧道傳播,並且沿著傳播路勁被事件處理程式處理。路由事件和依賴項屬性模型類似。wpf的 button 類提供了大家屬性的 click 事件,改時間繼承自抽象的 buttonbase基類 public abstract class butt...

學習WPF 了解路由事件

入門 我們先來看乙個例子 前台 後台 點選按鈕的執行效果 第乙個彈出視窗 第二個彈出視窗 第三個彈出視窗 說明 當點選按鈕之後,先觸發按鈕的click事件,再上查詢,發現stackpanel也註冊了該事件,那麼接著觸發stackpanel的button.click事件,依次再觸發grid的butto...

WPF學習之路 路由事件

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