今天看《WPF編程寶典》,看到了講WPF冒泡事件一章,在這裏出了問題一直沒有解決,在網上搜也是這樣,書上的原話是這樣的:界面設計如下,有3個按鈕並附加了Button.Click事件:
事件的函數體如下,根據Button的Name屬性來獲取事件的發送者:
但是自己寫了之後發現不論點擊哪個按鈕,sender一直是按鈕容器StackPanel對象,無法轉換爲Button 對象,因此函數中對各個按鈕設置的事件也無法調用。這裏的原因我目前也還沒有弄明白(先留個坑,以後再填)。
難道是因爲StackPanel位於頂層,Click事件都被它攔截了嗎,但是StackPanel對象並沒有Click事件啊!
經過自己看書之後,發現第二個參數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容器按鈕之外的位置單擊則不會觸發事件。
總結:
在父容器中定義同一事件,例如Button.Click事件,則容器中所有Button都會在單擊的時候激活該事件,但是我在編程過程中同過教程中的sender確無法判斷單擊來自哪個控件。然而通過RoutedEventArgs的source屬性卻能夠獲取單擊來自哪個控件,然後可以通過判斷,可以爲不同的控件定義各自的處理事件。
如果容器中的控件對某一用戶操作具有相同的響應則可以使用該方法。
初次寫,不足之處還請各位見諒,有錯誤請不吝賜教,良辰在此謝過!