WPF事件(一)內建路由事件
阿新 • • 發佈:2019-02-07
Windows是訊息驅動的作業系統,執行其上的程式也遵照這個機制執行,隨著面向物件開發平臺日趨成熟,微軟把訊息機制封裝成了更容易讓人理解的事件模型,一個事件包含3個關鍵點:事件的擁有者、事件的響應者、事件的訂閱關係
為了降低由事件訂閱帶來的耦合度和程式碼量,WPF推出了路由事件機制,路由事件與傳統的直接事件的區別在於,直接事件激發時傳送者直接將訊息通過事件訂閱交送給事件響應者,事件響應者使用其事件處理器方法対事件的發生做出響應、驅動程式邏輯按客戶需求執行,而路由事件的事件擁有者與事件響應者之間沒有直接顯示的訂閱關係,事件的擁有者只負責激發事件,事件將由誰響應它並不知道,時間的響應者則安裝有事件偵聽器,針對某類事件進行偵聽,當有此類事件傳遞過來,事件響應者就使用事件處理器來響應事件並決定事件是否可以繼續傳遞。
捕獲系統路由事件,WPF中大多數事件都是可路由事件,可路由事件在MSDN文件裡會具有Routed Event Information一欄,舉例,介面程式碼如下:
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="202" Width="202"> <Grid x:Name="gridRoot" Background="Lime"> <Grid x:Name="gridA" Margin="10" Background="Blue"> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Canvas x:Name="canvasLeft" Grid.Column="0" Background="Red" Margin="10"> <Button x:Name="buttonLeft" Content="Left" Width="40" Height="100" Margin="10" /> </Canvas> <Canvas x:Name="canvasRight" Grid.Column="1" Background="Yellow" Margin="10"> <Button x:Name="buttonRight" Content="Right" Width="40" Height="100" Margin="10" /> </Canvas> </Grid> </Grid> </Window>
當一個按鈕點選後,事件會順著向邏輯樹的主幹彙總,沿途的每一個控制元件都會收到這個事件,如果某一個控制元件需要監控這個事件,就可以捕獲這個事件
首先定義一個路由事件的響應函式:
private void ButtonClicked(object sender, RoutedEventArgs e)
{
MessageBox.Show((e.OriginalSource as FrameworkElement).Name);
}
然後,把需要關心的路由事件和這個函式關聯在一起
gridRoot.AddHandler(Button.ClickEvent, new RoutedEventHandler(ButtonClicked));
如果只關心某個特定物件發生某個事件,可以通過e.OriginalSource獲得發生事件的物件,就可以判斷出是那個物件觸發了這個事件