1. 程式人生 > >WPF事件(一)內置路由事件

WPF事件(一)內置路由事件

http 做出 back void 一個 繼續 每一個 是否 handle

原文:WPF事件(一)內置路由事件

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獲得發生事件的對象,就可以判斷出是那個對象觸發了這個事件


WPF事件(一)內置路由事件