在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

WPF 附加事件的更多相关文章

  1. 深入浅出WPF——附加事件(Attached Event)

    3.3 事件也附加——深入浅出附加事件 WPF事件系统中还有一种事件被称为附加事件(Attached Event),简言之,它就是路由事件.“那为什么还要起个新名字呢?”你可能会问. “身无彩凤双飞翼 ...

  2. 整理:WPF中应用附加事件制作可以绑定命令的其他事件

    原文:整理:WPF中应用附加事件制作可以绑定命令的其他事件 目的:应用附加事件的方式定义可以绑定的事件,如MouseLeftButton.MouseDouble等等 一.定义属于Control的附加事 ...

  3. WPF 之路由事件和附加事件(六)

    一.消息驱动与直接事件模型 ​ 事件的前身是消息(Message).Windows 是消息驱动的系统,运行其上的程序也遵循这个原则.消息的本质就是一条数据,这条消息里面包含着消息的类别,必要的时候还记 ...

  4. WPF 路由事件 Event Routing

    原文:WPF 路由事件 Event Routing 1.路由事件介绍 之前介绍了WPF的新的依赖属性系统,本篇将介绍更高级的路由事件,替换了之前的.net普通事件.相比.net的事件,路由事件具有更强 ...

  5. WPF 基础 - 事件

    1. 前言 WPF 事件的路由环境是 UI 组件树,先来看看这棵树. 1.1 Logical Tree 和 Visual Tree WPF 中的树有两种,一颗是逻辑树,另一颗也是逻辑树. 开玩笑,WP ...

  6. WPF 在事件中绑定命令(不可以在模版中绑定命令)

    其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实现将命令绑定到事件中. 上一篇中我们介绍了MVVMLight中的命令的用法,那么仅仅知道命令是 ...

  7. WPF自学入门(三)WPF路由事件之内置路由事件

    有没有想过在.NET中已经有了事件机制,为什么在WPF中不直接使用.NET事件要加入路由事件来取代事件呢?最直观的原因就是典型的WPF应用程序使用很多元素关联和组合起来,是否还记得在WPF自学入门(一 ...

  8. WPF路由事件二:路由事件的三种策略

    一.什么是路由事件 路由事件是一种可以针对元素树中的多个侦听器而不是仅仅针对引发该事件的对象调用处理程序的事件.路由事件是一个CLR事件. 路由事件与一般事件的区别在于:路由事件是一种用于元素树的事件 ...

  9. WPF 在事件中绑定命令

    导航:MVVMLight系列文章目录:<关于 MVVMLight 设计模式系列> 其实这也不属于MVVMLight系列中的东东了,没兴趣的朋友可以跳过这篇文章,本文主要介绍如何在WPF中实 ...

随机推荐

  1. OFBiz:component-load.xml

    component-load.xml定义了OFBiz的组件载入位置,默认的是通过目录来设置: <component-loader xmlns:xsi="http://www.w3.or ...

  2. PHP-汇总CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI

    什么是CGI 1.CGI是HTTP协议与其他外部应用程序之间的一个接口标准 2.CGI程序或脚本(CGI程序通过HTTP服务器去执行时, 必须在CGI程序中制定其执行程序的完整路径, 使SHELL能找 ...

  3. 【LeetCode】69. Sqrt(x) (2 solutions)

    Sqrt(x) Implement int sqrt(int x). Compute and return the square root of x. 解法一:牛顿迭代法 求n的平方根,即求f(x)= ...

  4. 简单hello world

    第一步配置路由: 打开app/http/route.php文件,输入:Route::get('/home', 'HomeController@index'); 第二步配置控制器: 控制文件可以手动添加 ...

  5. WebForm 页面ajax 请求后台页面 方法

    function ReturnOperation(InventoryID) { //入库 接口 if (confirm('你确认?')) { $.ajax({ type: "post&quo ...

  6. 摘:"error LNK2019: 无法解析的外部符号 该符号在函数 中被引用" 错误原因

    例如“error LNK2019: 无法解析的外部符号error LNK2001: 无法解析的外部符号“private: static struct _OVERLAPPED CUsbCom::g_Wr ...

  7. 公众号的TOKEN配置PHP代码

    1.在后台添加好URL和TOKEN和生成43位随机码  注意域名URL需要备案 2.上传到服务器 3.公众号后台要点提交即可 error_reporting(0); $signature=$_REQU ...

  8. Ubuntu安装deb软件包错误(依赖关系问题)解决

    执行命令 sudo dpkg -i XXX.deb 返回依赖关系错误提示 执行 sudo apt-get -f install 这条命令将自动安装需要的依赖包. 再次执行命令 sudo dpkg -i ...

  9. shell脚本分析 nginx日志访问次数最多及最耗时的页面

    当服务器压力比较大,跑起来很费力时候.我们经常做站点页面优化,会去查找那些页面访问次数比较多,而且比较费时. 找到那些访问次数高,并且比较耗时的地址,就行相关优化,会取得立竿见影的效果的. 下面是我在 ...

  10. MySQL 5.7 双主复制+keepalived,常规业务一般够用了

    业务需求: 为Zabbix搭建2个数据库,一个库给服务器监控用,一个库给网络监控用. 硬件: 两台服务器,硬盘是1.2 T SSD卡,内存128G 架构: 希望做双主复制+keepalived,架构大 ...