新聞中心
WPF是一款由微軟公司自行研發(fā)的專門用來處理圖形界面顯示方面的開發(fā)工具??梢暂p松的幫助開發(fā)人員實現(xiàn)與MAC相媲美的界面效果。在這里我們就先來了解一下WPF路由事件相關概念。#t#

“專業(yè)、務實、高效、創(chuàng)新、把客戶的事當成自己的事”是我們每一個人一直以來堅持追求的企業(yè)文化。 成都創(chuàng)新互聯(lián)公司是您可以信賴的網(wǎng)站建設服務商、專業(yè)的互聯(lián)網(wǎng)服務提供商! 專注于做網(wǎng)站、成都網(wǎng)站建設、軟件開發(fā)、設計服務業(yè)務。我們始終堅持以客戶需求為導向,結合用戶體驗與視覺傳達,提供有針對性的項目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場,引領市場!
我們創(chuàng)建一個WPF應用程序,代碼如下:
- < Window x:Class="Wpfceshi.
Window1" - xmlns="http://schemas.microsoft.
com/winfx/2006/xaml/presentation" - xmlns:x="http://schemas.
microsoft.com/winfx/2006/xaml" - Title="Window1" Height="300"
Width="300" MouseDown=
"Window_MouseDown" > - < Grid MouseDown="Grid_MouseDown"
x:Name="grid"> - < Button Height="30" Width="100"
Content="點擊我" MouseDown=
"Button_MouseDown"/> - < /Grid>
- < /Window>
- using System.Windows;
- using System.Windows.Input;
- namespace Wpfceshi
- {
- /// < summary>
- /// Window1.xaml 的交互邏輯
- /// < /summary>
- public partial class Window1 : Window
- {
- public Window1()
- {
- InitializeComponent();
- }
- private void Window_MouseDown
(object sender, MouseButtonEventArgs e) - {
- MessageBox.Show("Window被點擊");
- }
- private void Grid_MouseDown
(object sender, MouseButtonEventArgs e) - {
- MessageBox.Show("Grid被點擊");
- }
- private void Button_MouseDown
(object sender, MouseButtonEventArgs e) - {
- MessageBox.Show("Button被點擊");
- }
- }
- }
調試運行,鼠標右鍵點擊按鈕,會依次彈出三個對話框。(注意一定是鼠標右鍵,否則引發(fā)不了事件)
這里大家也許就會問了,我點擊的是按鈕,為什么Grid和Window也會引發(fā)事件呢?其實這就是WPF路由事件的機制,引發(fā)的事件由源元素逐級傳到上層的元素,Button—>Grid—>Window,這樣就導致這幾個元素都接收到了事件。
那么如何讓Grid和Window不處理這個事件呢?
我們只需要在Button_MouseDown這個方法中加上e.Handled = true; 這樣就表示事件已經(jīng)被處理,其他元素不需要再處理這個事件了。
- private void Button_MouseDown
(object sender, MouseButton
EventArgs e)- {
- MessageBox.Show("Button被點擊");
- e.Handled = true;
- }
這時如果我們需要Grid也參與處理這個事件該怎么做呢?我們只需要給他AddHandler即可。
修改代碼如下
- public Window1()
- {
- InitializeComponent();
- grid.AddHandler(Grid.
MouseDownEvent, new
RoutedEventHandler
(Grid_MouseDown1), true);- }
再加上這個方法
- private void Grid_MouseDown1
(object sender, RoutedEventArgs e)- {
- MessageBox.Show("Grid被點擊");
- }
到此大家應該對WPF路由事件有大概的認識了吧。
上面我們看到的只是路由事件中的一種方式:氣泡。還有兩種:隧道、直接。
總結:
氣泡事件是WPF路由事件中最為常見,它表示事件從源元素擴散(傳播)到可視樹,直到它被處理或到達根元素。這樣您就可以針對源元素的上方層級對象處理事件。例如,您可向嵌入的 Grid 元素附加一個 Button.Click 處理程序,而不是直接將其附加到按鈕本身。氣泡事件有指示其操作的名稱(例如,MouseDown)。隧道事件采用另一種方式,從根元素開始,向下遍歷元素樹,直到被處理或到達事件的源元素。這樣上游元素就可以在事件到達源元素之前先行截取并進行處理。根據(jù)命名慣例,隧道事件帶有前綴 Preview(例如 PreviewMouseDown)。
直接事件類似 .NET Framework 中的正常事件。該事件***可能的處理程序是與其掛接的委托。
對于WPF路由事件中的隧道事件,大家可以寫個小程序測試一下
- < Window x:Class="Wpfceshi.
Window1"- xmlns="http://schemas.
microsoft.com/winfx/2006/xaml/
presentation"- xmlns:x="http://schemas.
microsoft.com/winfx/2006/xaml"- Title="Window1" Height="300"
Width="300" PreviewMouseDown=
"Window_PreviewMouseDown" >- < Grid PreviewMouseDown=
"Grid_PreviewMouseDown"
x:Name="grid">- < Button Height="30" Width="100"
Content="點擊我" PreviewMouseDown=
"Button_PreviewMouseDown"/>- < /Grid>
- < /Window>
- using System.Windows;
- using System.Windows.Input;
- namespace Wpfceshi
- {
- /// < summary>
- /// Window1.xaml 的交互邏輯
- /// < /summary>
- public partial class Window1 : Window
- {
- public Window1()
- {
- InitializeComponent();
- }
- private void Button_PreviewMouseDown
(object sender, MouseButtonEventArgs e)- {
- MessageBox.Show("Button被點擊");
- }
- private void Grid_PreviewMouseDown
(object sender, MouseButtonEventArgs e)- {
- MessageBox.Show("Grid被點擊");
- }
- private void Window_PreviewMouseDown
(object sender, MouseButtonEventArgs e)- {
- MessageBox.Show("Window被點擊");
- }
- }
- }
可以看到,隧道事件的傳遞剛好與WPF路由事件中的氣泡事件相反。
分享名稱:WPF路由事件各種方法總結
URL網(wǎng)址:http://fisionsoft.com.cn/article/dpgchgg.html


咨詢
建站咨詢
