WPF路由事件


與傳統的winform不同,WPF的事件的發送者與事件的響應着並沒有直接的關系,當然而這也可以是同一個對象。

事件僅僅是沿着邏輯樹一直向上轉發,如果有對象對事件進行響應,則會出發相應的動作。

舉例來說。

新建一個窗口

    <Grid Background="#FFB6B600" MouseUp="Grid_MouseUp_1" Name="g1">
        <Grid Margin="20" Background="Red" MouseUp="Grid_MouseUp_1" Name="g2">
            <Grid  Margin="20" Background="#FF074AD8" MouseUp="Grid_MouseUp_1" Name="g3">
                <Button x:Name="btn1" Content="Button" HorizontalAlignment="Left" Margin="182,103,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>


            </Grid>
        </Grid>
    </Grid>

我們先不管中間的button,可以看到每一個grid都實現了Grid_MouseUp_1方法

        private void Grid_MouseUp_1(object sender, MouseButtonEventArgs e)
        {
            Grid g = sender as Grid;
            MessageBox.Show(g.Name);
            
        }

這個時候,你單擊其中一個gird,會發現每一個gird都會響應這個單擊,因為每一個事件處理完成該事件以后,就會繼續轉發該事件,所以事件會沿着視圖樹傳播到每一個grid對象中。視圖樹可以在文檔大綱中看到。

 

剛才我們說了,事件的發送者和響應着是沒有任何直接關系的。那么也就是說響應button的click事件的不一定是button 可以是任何對象。

我們添加如下代碼

        public MainWindow()
        {
            InitializeComponent();
            g1.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click_1));
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            FrameworkElement f = sender as FrameworkElement;
            MessageBox.Show(f.Name);
        }

點擊按鈕以后,會將事件的的響應對象的名字打印出來。

這個時候會看到兩個messagebox,一個提示btn1,就是按鈕本身的響應,另外一個是g1就是grid的響應。

每一個對象都有一個eventhandler,需要響應那個事件,僅僅需要將對應的事件添加進去就可以了。

如g1添加對按鈕點擊事件的響應。

g1.AddHandler(Button.ClickEvent, new RoutedEventHandler(Button_Click_1));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM