代码改变世界

WPF 附加事件

2013-09-10 20:51 Andrew.Wangxu 阅读(...) 评论(...) 编辑 收藏

    在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

参考:http://www.wxzzz.com/?id=129