问题:在项目中发现,可以重复多次添加同一个Handler,导致触发时执行多次的问题。

这个现象也很好测试:

前台准备一个Label文本

<Label x:Name="label" Content="测试重复多次AddHandler点击事件" Width="300" Height="200"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>

后台给它重复多次添加同一个事件处理器Handler。这里选用鼠标左键弹起事件方便测试。

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); CheckAddHandler();
} // 测试重复多次添加同一个Handler
private void CheckAddHandler()
{
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
} // 鼠标左键弹起事件
private void Label_MouseLeftButtonUpEvent(object sender, RoutedEventArgs e)
{
System.Console.WriteLine("添加事件");
}
}

运行后,看输出可知,该Handler可以重复执行多次。


结论:如果要添加Handler,但又不想重复添加,可以在添加之前先调用清理该Handler,然后再添加。从而保证只添加一次。

// 先移出
label.RemoveHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));
// 再添加
label.AddHandler(Label.MouseLeftButtonUpEvent, new RoutedEventHandler(Label_MouseLeftButtonUpEvent));

【C#】AddHandler可重复多次添加事件处理器的问题的更多相关文章

  1. JQ 为未来元素添加事件处理器—事件委托

    随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...

  2. 使用dojo.connect()添加事件的注意事项

    使用dojo.connect()添加事件处理器是很方便的,不用再考虑跨浏览器的问题了.但要想正确地使用这个方法,仍然要注意几个问题:        1.用dojo.byId()获取的是dom元素,而用 ...

  3. 编写高质量代码改善C#程序的157个建议——建议139:事件处理器命名采用组合方式

    建议139:事件处理器命名采用组合方式 所谓事件处理器,就是实际被委托执行的那个方法.查看如下代码: public MainWindow() { InitializeComponent(); Butt ...

  4. 给Jquery动态添加的元素添加事件

    给Jquery动态添加的元素添加事件 来源:[http://wangqixia.diandian.com/post/2011-05-10/6597866] 我想很多人都会向我一样曾经 被新元素的事件绑 ...

  5. 添加事件及Event对象的兼容写法

    一.事件流 事件流描述的是从页面中接受事件的顺序. IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流 1.事件冒泡 事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点) ...

  6. [转载]给Jquery动态添加的元素添加事件

    原文地址:给Jquery动态添加的元素添加事件作者:小飞侠 我想很多人都会向我一样曾经 被新元素的事件绑定困惑很久也就是在页面加载完成后给元素绑定了事件,但又新增加的元素上却没有绑定任何事件. js的 ...

  7. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

  8. JQuery实现表格自动增加行,对新行添加事件

    实现功能: 通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢:通过此程序实现表格动态增加行,一直保持最下面有多个空白行. 效果: 一:原始页面 二:表1增加新行并 ...

  9. jquery动态生成的元素添加事件的方法

    动态生成的元素如果要添加事件,要写成 $(document).on("click", "#txtName", function() { alert(this.v ...

随机推荐

  1. spring thymeleaf 自定义标签

    概述 thymeleaf2.1.5自定义标签及自定义属性案例,类似于JSP中的自定义JSTL标签 详细 代码下载:http://www.demodashi.com/demo/10495.html 一. ...

  2. ocat 资源路径-时间控件

    http://www.htmleaf.com/jQuery/Calendar-Date-Time-picker/201504251737.html

  3. Android开发之动态检索(Filter)联系人

    1. 将所有联系人都转换为数字串,存到列表中. 将联系人姓名转换为数字串.例如,张丽思创->zlsc->9572. 过程解析: 张 – zhang – z – 9 丽 – li – l – ...

  4. maven 发布到仓库

    到nexus中看到的仓库地址 <distributionManagement> <repository> <id>releases</id> <n ...

  5. Log4Net的概念和使用

    第一篇文本日志 log4net简介: log4net简介: log4net是一个功能著名的开源日志记录组件,由java平台而来. 利用log4net可以方便地将日志信息记录到文件.控制台.Window ...

  6. Python程序数据溢出问题或出现 NAN 问题

    [数据溢出问题] overflow:溢出 overflow:上溢 underflow:下溢 数据溢出包括上溢和下溢. 上溢可以理解为:你想用一个int类型来保存一个非常非常大的数,而这个超出了int类 ...

  7. MM 算法与 EM算法概述

    1.MM 算法: MM算法是一种迭代优化方法,利用函数的凸性来寻找它们的最大值或最小值. MM表示 “majorize-minimize MM 算法” 或“minorize maximize MM 算 ...

  8. DBA_实践指南系列3_Oracle Erp R12系统克隆Clone(案例)

    2013-12-03 Created By BaoXinjian

  9. 敏捷转型中why与how的总结

    敏捷转型參考框架: 为了成功顺畅地推行敏捷开发.下面将对整个敏捷转型參考框架作个整体说明.为企业进行敏捷转型提供基本方法參考.整个敏捷转型參考框架主要包括5个步骤,前两个步骤主要是回答 Wh y的问题 ...

  10. python 小游戏之摇骰子猜大小

    最近学习Python的随机数,逻辑判断,循环的用法,就想找一些练习题,比如小游戏猜大小,程序思路如下: 开发环境:python2.7 , 附上源代码如下: 摇骰子的函数,这个函数其实并不需要传任何参数 ...