在WPF中有许多控件有他们自己的特殊的事件。按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。
这回导致两难的境地。假设在 StackPanel 面板中包装了一堆按钮,并且希望在一个事件处理程序中处理所有这些按钮的单击事件。粗略的方法是将每个按钮 Click 事件都注册到同一个事件处理方法中。但是 Click 事件支持事件冒泡,从而提供了更好的一种选择。可以通过处理更高层次的元素的 Click 事件(如包含按钮的 StackPanel 面板)来处理所有的按钮单击事件。
这里会遇到一个问题,在StackPanel面板中并没有Click事件,正如上所说“按钮就是一个例子——它添加了 Click 事件,而其他任何类都没有定义该事件。”,所以 XAML 解析器会解释成一个错误。解决方案是以“类名.事件名”的形式使用不同的关联事件语法。下面是示例:
<StackPanel Name="panel1" Button.Click="StackPanel_Click_1" Margin="5"> <Button Name="cmd1" Tag="1">Command 1</Button> <Button Name="cmd2" Tag="2">Command 2</Button> <Button Name="cmd3" Tag="3">Command 3</Button> </StackPanel>
现在事件处理程序就可以接收到 StackPanel 面板中包含的所有按钮单击事件了。
也可以在代码中关联附加事件,但是需要使用 UIElement.AddHandler() 方法,而不能使用 += 运算符语法。下面是一个示例(该示例假设 StackPanle 面板已经被命名为 pnlButtons ):
pnlButtons.AddHandler(Button.Click, new RoutedEventHandler(StackPanel_Click_1));
在 StackPanel_Click_1 事件处理方法中进行处理程序。
下面是一个完整的例子:
XAML
<Window x:Class="_1016_AppendEvent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <StackPanel Name="panel1" Button.Click="StackPanel_Click_1" Margin="5"> <Button Name="cmd1" Tag="1">Command 1</Button> <Button Name="cmd2" Tag="2">Command 2</Button> <Button Name="cmd3" Tag="3">Command 3</Button> </StackPanel> </Window>
C#:
private void StackPanel_Click_1(object sender, RoutedEventArgs e) { MessageBox.Show(e.Source.ToString()); }
源码下载:http://files.cnblogs.com/andrew-blog/1016_AppendEvent.rar
开发工具:VS2012