WPF冒泡事件

今天看《WPF編程寶典》,看到了講WPF冒泡事件一章,在這裏出了問題一直沒有解決,在網上搜也是這樣,書上的原話是這樣的:界面設計以下,有3個按鈕並附加了Button.Click事件:
窗體佈局
事件的函數體以下,根據Button的Name屬性來獲取事件的發送者:
Button.Click函數體
可是本身寫了以後發現不論點擊哪一個按鈕,sender一直是按鈕容器StackPanel對象,沒法轉換爲Button 對象,所以函數中對各個按鈕設置的事件也沒法調用。這裏的緣由我目前也尚未弄明白(先留個坑,之後再填)
難道是由於StackPanel位於頂層,Click事件都被它攔截了嗎,可是StackPanel對象並無Click事件啊!web

通過本身看書以後,發現第二個參數RoutedEventArgs的source屬性中對於鼠標事件時,表示的是事件發生時鼠標指針元素下面全部元素中最靠上的元素。這樣不就能夠獲取StackPanel容器中的Button嗎,因而本身編寫嘗試了一下:編程

private void btn_Click(object sender, RoutedEventArgs e)
        {
            if(e.Source==cmd1)
            {
                MessageBox.Show("cmd1");
            }
            else if (e.Source == cmd2)
            {
                MessageBox.Show("cmd2");
            }
            else if (e.Source == cmd3)
            {
                MessageBox.Show("cmd3");
            }
            else
            {
                MessageBox.Show("null");
            }
        }

運行以後,點擊btn1,彈出messagebox 「btn1」,依次單擊3個按鈕,分別彈出各自的消息窗。說明在StackPanel聲明的Button.Click事件能被按鈕獲取;而在StackPanel容器按鈕以外的位置單擊則不會觸發事件。svg

總結:

在父容器中定義同一事件,例如Button.Click事件,則容器中全部Button都會在單擊的時候激活該事件,可是我在編程過程當中同過教程中的sender確沒法判斷單擊來自哪一個控件。然而經過RoutedEventArgs的source屬性卻可以獲取單擊來自哪一個控件,而後能夠經過判斷,能夠爲不一樣的控件定義各自的處理事件。
若是容器中的控件對某一用戶操做具備相同的響應則可使用該方法。函數

初次寫,不足之處還請各位見諒,有錯誤請不吝賜教,良辰在此謝過!佈局