【C#】AddHandler可重复多次添加事件处理器的问题
问题:在项目中发现,可以重复多次添加同一个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可重复多次添加事件处理器的问题的更多相关文章
- JQ 为未来元素添加事件处理器—事件委托
随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...
- 使用dojo.connect()添加事件的注意事项
使用dojo.connect()添加事件处理器是很方便的,不用再考虑跨浏览器的问题了.但要想正确地使用这个方法,仍然要注意几个问题: 1.用dojo.byId()获取的是dom元素,而用 ...
- 编写高质量代码改善C#程序的157个建议——建议139:事件处理器命名采用组合方式
建议139:事件处理器命名采用组合方式 所谓事件处理器,就是实际被委托执行的那个方法.查看如下代码: public MainWindow() { InitializeComponent(); Butt ...
- 给Jquery动态添加的元素添加事件
给Jquery动态添加的元素添加事件 来源:[http://wangqixia.diandian.com/post/2011-05-10/6597866] 我想很多人都会向我一样曾经 被新元素的事件绑 ...
- 添加事件及Event对象的兼容写法
一.事件流 事件流描述的是从页面中接受事件的顺序. IE的事件流是事件冒泡流,而Netscape的事件流是事件捕获流 1.事件冒泡 事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点) ...
- [转载]给Jquery动态添加的元素添加事件
原文地址:给Jquery动态添加的元素添加事件作者:小飞侠 我想很多人都会向我一样曾经 被新元素的事件绑定困惑很久也就是在页面加载完成后给元素绑定了事件,但又新增加的元素上却没有绑定任何事件. js的 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
- JQuery实现表格自动增加行,对新行添加事件
实现功能: 通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢:通过此程序实现表格动态增加行,一直保持最下面有多个空白行. 效果: 一:原始页面 二:表1增加新行并 ...
- jquery动态生成的元素添加事件的方法
动态生成的元素如果要添加事件,要写成 $(document).on("click", "#txtName", function() { alert(this.v ...
随机推荐
- kubernetes中使用NFS创建pv_pvc
Persistent Volume(持久化卷)简称PV, 是一个K8S资源对象,我们可以单独创建一个PV, 它不和Pod直接发生关系, 而是通过 Persistent Volume Claim, 简称 ...
- HDUOJ----(1031)Design T-Shirt
Design T-Shirt Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- CoreData 增删改查
#pragma mark - Core Data Methods - (void)insertObjectWithFileName:(NSString *)fileName { /** SQL新增记录 ...
- MySQL 获取某一个分类ID的所有父或子分类查询结果
创建一个自定义函数: ; DELIMITER $$ USE `dressv_website`$$ DROP FUNCTION IF EXISTS `fn_QueryRelation`$$ CREATE ...
- 验证码在后台的编写,并实现点击验证码图片时时发生更新 C# 项目发布到IIS后不能用log4net写日志
验证码在后台的编写,并实现点击验证码图片时时发生更新 验证码在软件中的地位越来越重要,有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试:下面就是实现验证码的基本步骤: ...
- Android 实现 HttpClient 请求Https
如题,默认下,HttpClient是不能请求Https的,需要自己获取 private static final int SET_CONNECTION_TIMEOUT = 5 * 1000; priv ...
- Unix环境高级编程(十三)守护进程
守护进程也称为精灵进程是一种生存期较长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.unix系统有很多守护进程,大多数 ...
- WCF使用net.tcp绑定时的注意事项
IIS Express没有net.tcp绑定功能,本地测试的话只能使用本机的IIS进行承载,并且需要相应的配置(参见上一篇文章). 算了,直接举一个配置例子吧,懒得写了... <system.s ...
- 使用perldoc阅读perl文档
perl在安装的时候,就给我们送上一份大礼,组织精美,解释详细的perl百科全书已经安装在你的电脑里面了,遇到问题不要在去搜索那些博客了,还是练练英文,看看perldoc吧,呵呵. 1.用perldo ...
- Spring 一二事(7) - annotation
之前的文章大多都是一带而过,一方面比较简单,一方面不是用的注解形式 在企业开发中,主要还是使用的注解来进行开发的 1 <!-- component:把一个类放入到spring容器中,该类就是一个 ...