WPF-12 路由事件之二

WPF 為我們提供了許多不同的事件處理機制——它們是冒泡、隧道和直接的。這些都稱為路由事件

直接事件

直接在事件源上處理,這個有點像WinForms中的按鈕OnClick事件,直接在事件處理程序中處理業務

冒泡事件

當事件沒有被元素(比如一個文本框)處理并且事件“冒泡”到持有它的 UI 容器時,就會發生冒泡

例如,假設你有一個包含StackPanel的窗口,在該面板內你有一個Grid,在該Grid內您有一個文本框。如果文本框未處理事件,則它會冒泡到Grid級別,如果未在該級別處理,則事件會進一步冒泡(稱為可視化樹)到可能會或可能不會被處理的面板。這個過程一直持續到它被處理或事件脫離了最頂層的元素

隧道事件

隧道與冒泡相反,事件不是沿著可視樹向上傳播,而是沿著可視樹向下傳播到源元素。隧道事件都以Preview開頭,例如 PreviewDownKey和PreviewMouseButtonDown。可以在它們到達目標元素的途中捕獲它們并進行處理

事件對

大多數冒泡事件都與隧道事件配對。例如,PreviewKeyDown(隧道)鍵事件與Keydown 事件(冒泡)配對。當隧道事件沿著視覺樹向下工作并命中它起源的元素(比如一個按鈕)時,如果它沒有處理,那么該按鈕將啟動一個“Keydown”冒泡事件,該事件會在視覺樹上冒泡直到它自己被處理

處理事件

每種類型的事件處理程序都傳遞一個RoutedEventArgs對象。該對象有三個常用屬性,Handled屬性和Source屬性以及OriginalSource屬性。將Handled設置為 true,并且任何沿可視化樹的事件處理程序將不再處理該事件

前面我們的示例描述了一個指向文本框的隧道KeyDown事件。如果包含UI元素(窗口、面板或表格)捕獲并處理隧道事件(通過將 Handled 屬性設置為 true),則文本框將不會接收該事件,并且不會觸發任何匹配的冒泡事件

<Window x:Class="Example_11.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Example_11"mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Keyboard.PreviewKeyDown="Window_PreviewKeyDown"Keyboard.KeyDown="Window_KeyDown"><StackPanel Height="300" Width="400" Keyboard.PreviewKeyDown="StackPanel_PreviewKeyDown"Keyboard.KeyDown="StackPanel_KeyDown"><Grid Height="250" Width="300"Keyboard.PreviewKeyDown="Grid_PreviewKeyDown"Keyboard.KeyDown="Grid_KeyDown"><Grid.RowDefinitions><RowDefinition></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><TextBox Grid.Row="0" Width="200" Height="30"></TextBox><Button Grid.Row="1" Width="200" Height="50">Button</Button></Grid></StackPanel>
</Window>
using System.Windows;
using?System.Windows.Input;
namespace Example_11
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Window_PreviewKeyDown(object sender, KeyEventArgs e){MessageBox.Show("Window_PreviewKeyDown");//e.Handled = true;}private void StackPanel_PreviewKeyDown(object sender, KeyEventArgs e){MessageBox.Show("StackPanel_PreviewKeyDown");//e.Handled = true;}private void Grid_PreviewKeyDown(object sender, KeyEventArgs e){MessageBox.Show("Grid_PreviewKeyDown");//e.Handled = true;}private void Grid_KeyDown(object sender, KeyEventArgs e){MessageBox.Show("Grid_KeyDown");//e.Handled = true;}private void Window_KeyDown(object sender, KeyEventArgs e){MessageBox.Show("Window_KeyDown");//e.Handled = true;}private void StackPanel_KeyDown(object sender, KeyEventArgs e){MessageBox.Show("StackPanel_KeyDown");//e.Handled = true;}}
}

當我們向TextBox輸入值時,會看到事件的執行順序為:

  1. Window_PreviewKeyDown

  2. StackPanel_PreviewKeyDown

  3. Grid_PreviewKeyDown

  4. Grid_KeyDown

  5. StackPanel_KeyDown?

  6. Window_KeyDown

    在本文中,我們看到 WPF 中的用戶界面事件可以是隧道、冒泡或直接事件。針對隧道和冒泡事件,我們可以捕捉、處理事件或讓事件繼續執行。我們可以通過捕獲隧道事件并將 Handled 屬性設置為 true 來阻止息到達控件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281609.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對01背包的分析與理解(圖文)

首先謝謝Christal_R的文章(點擊轉到鏈接)讓我學會01背包 本文較長&#xff0c;但是長也意味著比較詳細&#xff0c;希望您可以耐心讀完。 題目: 現在有一個背包(容器),它的體積(容量)為V,現在有N種物品(每個物品只有一個),每個物品的價值W[i]和占用空間C[i]都會由輸入給出,現在…

linux內核源碼剖析 博客,【Linux內存源碼分析】頁面遷移

頁面遷移其實是伙伴管理算法中的一部分&#xff0c;鑒于其特殊性&#xff0c;特地另行分析。它是2007年的時候&#xff0c;2.6.24內核版本開發時&#xff0c;新增碎片減少策略(the fragmentation reduction strategy)所引入的。該策略也稱之為反碎片技術(anti-gragmentation)。…

360的下一代SOC是這個樣子的

幾乎所有大型企業或機構的IT系統中&#xff0c;都會有安全運營中心(SOC)&#xff0c;它是網絡安全防護體系從設備部署到系統建設&#xff0c;再到統一管理&#xff0c;這一發展過程的自然產物。但在國內的實際應用中&#xff0c;SOC的問題多多。 首先是數據類型不全&#xff0c…

【轉載】利用scipy.misc等庫對jpg以及png等圖像數據預處理(用于深度學習喂數據)...

http://blog.csdn.net/qq_16949707/article/details/56306720 轉載于:https://www.cnblogs.com/tenderwx/p/8057599.html

2018年下半年網絡公式考試案例分析真題

閱讀以下說明&#xff0c;回答問題1至問題3&#xff0c;將解答填入答題紙對應的解答欄內。【說明】某公司網絡劃分為兩個子網&#xff0c;其中設備A是DHCP服務器&#xff0c;如圖3-1所示。 【問題1】(6分&#xff0c;每空2分)DHCP在分配IP地址時使用 (1) 的方式&#xff0c; 而…

哪一個不是linux常用的shell,Linux下查看使用的是哪種shell的方法匯總

查看當前發行版可以使用的shell復制代碼代碼如下:[rootlocalhost ~]$ cat /etc/shells/bin/sh/bin/bash/sbin/nologin查看當前使用的shell方法一、最常用的查看shell的命令&#xff0c;但不能實時反映當前shell復制代碼代碼如下:[rootlocalhost ~]$ echo $SHELL/bin/bash二、下…

企業建設呼叫中心需要考慮哪些因素

呼叫中心發展至今&#xff0c;它的意義早已不是90年代末,只是簡單地解決客戶客服系統的要求。現在的呼叫中心有了新的使命&#xff0c;比如拓展成為一個信息服務中心&#xff0c;或者成為一個營銷中心。客戶如何能通過這樣的手段&#xff0c;使企業與其他的企業之間形成差異化的…

【單片機入門】(三)應用層軟件開發的單片機學習之路-----UART串口通訊和c#交互...

本文由網友投稿。作者&#xff1a;陳顯達原文標題&#xff1a;【單片機入門】(三)應用層軟件開發的單片機學習之路-----UART串口通訊和c#交互原文鏈接&#xff1a;https://www.cnblogs.com/1996-Chinese-Chen/p/16826558.html引言在第一章博客中&#xff0c;我們講了Arduino對E…

linux中使用yum的優點,linux – 自動“yum update”以保證服務器安全 – 優點和缺點?...

這取決于根據我使用CentOS的經驗,它非常安全,因為您只使用CentOS基本存儲庫.您是否應該偶爾嘗試更新失敗…是…在您應該期望出現故障的硬盤驅動器或偶爾出現故障的CPU的同一級別上.您永遠不會有太多備份. &#x1f642;關于自動更新的好處是,您可以比手動修補更快(因此更安全).…

高能力成熟度軟件企業中軟件質量工程師的職責

隨著科學技術的不斷發展進步&#xff0c;企業之間的競爭越來越激烈。軟件企業要想在競爭中發展生存&#xff0c;提高軟件產品質量已成為必要條件。在一些高能力成熟度軟件企業中&#xff0c;專門成立了質量保證和控制職能部門&#xff0c;起著提高項目管理透明性和確保軟件產品…

存儲過程和函數的區別

存儲過程和函數的區別存儲過程和函數目的是為了 可重復地 執行操作數據庫的sql語句的集合。區別是寫法和調用上。寫法上&#xff1a;存儲過程的參數列表可以有輸入參數、輸出參數、可輸入輸出的參數&#xff1b;函數的參數列表只有輸入參數&#xff0c;并且有return <返回值…

機器學習案例丨基于廣泛和深入的推薦 - 餐廳評級預測

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;18分鐘&#xff09;Microsoft Azure Machine Learning Studio 是微軟強大的機器學習平臺&#xff0c;在設計器中&#xff0c;微軟內置了15個場景案例&#xff0c;但網上似乎沒有對這15個案例深度刨析的分析資料&#…

css linux 等寬字體,比例字體等寬字體

我們都知道等寬字體和比例字體的區別&#xff0c;就在于比例字體(Monospaced Font)即每個字母寬度是按一定比例自動調整的&#xff0c;而等寬字體(Proportional font)則是固定寬度&#xff0c;固定間距&#xff0c;字體的每一個字母和字符所占的水平空間都是相同的。比例字體&a…

三星智能家居系統頻繁故障 大批用戶受到影響

Shelley Powers正在她密蘇里州郊區的房子中鼾睡&#xff0c;突然警鈴大作將她驚醒&#xff0c;在仔細排查之后&#xff0c;發現是虛驚一場&#xff0c;是安全傳感器誤報。在此之后的幾周&#xff0c;她的三星Smart Things智能家居系統頻繁出現故障&#xff0c;比如設定的燈具不…

適用于 .NET 的開源文本差異對比組件

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具或組件&#xff0c;希望對您有用&#xff01;簡介對于開發人員來說&#xff0c;Git 是我們經常使用的工具&#xff0c;在每次編寫完代碼并提交后&#xff0c;我們可以通過 git dif…

MySQL—查詢某時間范圍的數據

-- 查詢今天的數據 select * from user where to_days(birthday) to_days(CURDATE()); -- 查詢昨天的數據 select * from user where to_days(CURDATE()) - to_days(birthday)<1; -- 查詢最近7天的數據 select * from user where birthday > DATE_SUB(CURDATE(),INTERVA…

box-shadow陰影合集

2019獨角獸企業重金招聘Python工程師標準>>> * box-shadow可以設置6個值。其中4個可選&#xff1b;2個必須指定&#xff1a;分別是x軸偏移量和y軸偏移量&#xff0c;這2個值可以是正值&#xff0c;可以是負值&#xff0c;也可以是0&#xff0c;但不可以省略不寫 陰影…

《數據科學R語言實踐:面向計算推理與問題求解的案例研究法》一一2.5 為跨年度的個人參賽選手構造記錄...

本節書摘來自華章計算機《數據科學R語言實踐&#xff1a;面向計算推理與問題求解的案例研究法》一書中的第2章&#xff0c;第2.5節,作者&#xff1a;[美] 德博拉諾蘭&#xff08;Deborah Nolan&#xff09;  鄧肯坦普朗&#xff08;Duncan Temple Lang&#xff09;  更多章…

基于 abp 微服務架構的開源低代碼平臺

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具或組件&#xff0c;希望對您有用&#xff01;簡介 ABP-MicroService是 一個基于ABP vNext微服務架構、vue-element-admin的后臺管理框架&#xff0c;適用于大型分布式業務系統和企…

linux android sdk gengxinman,Android 實現增量更新

一、概述增量更新相較于全量更新的好處不言而喻&#xff0c;利用差分算法獲得1.0版本到2.0版本的差分包&#xff0c;這樣在安裝了1.0的設備上只要下載這個差分包就能夠完成由1.0-2.0的更新。比如&#xff1a;存在一個1.0版本的apkapk1.png然后需要升級到2.0版本&#xff0c;而2…