WPF的路由事件、冒泡事件

WPF的路由事件、冒泡事件


開發工具與關鍵技術:Visual Studio+WPF
做者:奉平花
撰寫時間:2019年04月14日web


1:什麼是路由事件
WPF中的事件爲路由事件,所謂路由事件,MSDN定義以下:
功能定義:路由事件是一種能夠針對元素樹中的多個偵聽器(而不是僅針對引起該事件的對象)調用處理程序的事件。
實現定義:路由事件是一個 CLR 事件,能夠由 RoutedEvent 類的實例提供支持並由 Windows Presentation Foundation (WPF) 事件系統來處理。
但這兩類定義都比較抽象,咱們來看更具體的定義:
在這裏插入圖片描述svg

TextBlock -->StackPanel–>Border —>…
1、路由事件一:邏輯樹和可視樹
什麼是邏輯樹
邏輯樹就是描述WPF界面元素的實際構成,它是由程序在XAML中全部的UI元素組成。最顯著的特色就是由佈局控件、或者其餘經常使用的控件組成。
從上面的代碼中能夠看出,Window、Grid、StackPanel、TextBox其實就是XAML界面的邏輯樹。
什麼是可視樹
可視樹是由界面上可見的元素構成的,這些元素主要是由從Visual或者Visual3D類中派生出來的類。
上面代碼中的Window、Grid、StackPanel、TextBox它們自己就包含一些由Visual或者Visual3D類派生出的一些可視樹的元素來組成的。
2、邏輯樹和可視樹的遍歷
邏輯樹遍歷使用LogicalTreeHelper類。
可視樹遍歷使用VisualTreeHelper類。
演示遍歷邏輯樹和可視樹
一、 XAML界面左邊顯示邏輯樹,右邊顯示可視樹,代碼以下
在這裏插入圖片描述
2.中斷事件路由 全部的路由事件都共享一個公共的事件數據基類 RoutedEventArgs。 RoutedEventArgs 定義了一個採用布爾值的 Handled 屬性。 Handled 屬性的目的在於,容許路由中的任何事件處理程序經過將 Handled 的值設置爲 true 來將路由事件標記爲「已處理」。
在這裏插入圖片描述
在本文一開始的例子中,若是咱們將MouseUP,改成PreviewMouseUP,效果會如何呢。
區別:
冒泡事件:在YesTB上點擊,首先彈出「button」,再彈出「panel」。
預覽事件(隧道事件)事件:在YesTB上點擊,首先彈出「panel」,再彈出「button」。
看到了這點區別,那麼咱們加入e.Handled=true的時機也要不一樣。首先,
冒泡事件例子中:e.Handled=true加在YesTB_PreviewMouseUp中,加入後,點擊YesTB,將只彈出「button」。
預覽事件(隧道事件)例子中:e.Handled=true家在StackPanel_PreviewMouseUp中,加入後,點擊YesTB,將只彈出「panel」。工具