在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. Linux异步IO操作

    Linux® 中最常用的输入/输出(I/O)模型是同步 I/O.在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止.这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需 ...

  2. 公司交换机arp 绑定操作

    1.首先登入:192.168.1.1 2.sys 3.dis arp | inc 192.168.1.49(查看该ip绑定情况) 4.undo arp 192.168.1.49(不绑定命令)

  3. cygwin下安装scws

    安装gcc和make命令 1.找到cygwin的etc目录中有一个名为passwd的文件.   2.用UE或记事本打开passwd这个文件,找到以下部分,把其中的windows用户名admin换成ro ...

  4. laravel-v5.1数据库连接文件是.env文件

  5. php简单混淆类加密文件如何解密?

    最近在整理单位购买的源码时,发现源码里好多文件都混淆加密了.虽然不解密也不影响使用,但是心里总觉得有些别扭,便试着将加密的文件解密. 首先,百度了一下,看网上是否有现成的混淆类解密工具,搜到了一个ht ...

  6. struts2开发流程及配置,域对象对数据存储的3种方式

    一.开发流程 1)引入 jar 包,其中必须引入的有(我是用的struts是2.3.32) commons-fileupload-1.3.2.jar     |文件上传下载commons-io-2.2 ...

  7. Linux下的MySQL主主复制

    为什么,会有mysql的主主复制.因为在一些高可用的环境中,mysql的主从不能满足现实中的一些实际需求.比如,一些流量大的网站数据库访问有了瓶颈,需要负载均衡的时候就用两个或者多个的mysql服务器 ...

  8. 第二节 JVM优化应用以及知识总结

    在JVM中.假设98%的时间是用于GC且可用的HeapSize不足2%时将会抛出OOM异常:HeapSize最大不要超过可用物理内存的80%,一般-Xms –Xmx设置为同样,-Xmn设置为1/4的- ...

  9. View坐标系详解(getTop(),getLeft(),getX(),getY(),getLocationOnScreen(), getLocationInWindow())

    View 提供了如下 5 种方法获取 View 的坐标:1. View.getTop().View.getLeft().View.getBottom().View.getRight();2. View ...

  10. maven中配置jdk版本

    1 maven 中配置 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins< ...