與傳統的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));