当前位置: 首页 > 编程日记 > 正文

C#(WPF)去除事件中注册的事件处理方法!

在WPF中,移除一个事件中已经注册的处理方法,看似简单,实际还是很痛苦的一件事情。因为C#的灵活性,定义事件的方法也是多种多样。
我自己定义了一个事件:

public event EventHandler TestEvent;

当我想注销这个事件上注册的所有方法的时候,我可以按如下的方法进行

 Delegate[] dels = TestEvent.GetInvocationList();foreach (var d in dels){TestEvent-= d as EventHandler;}

但是,当我想注销一个Window上的Closed上注册的事件时,发现在Closed上根本没有GetInvocationList方法。这是怎么回事呢。通过反编译查看微软的代码,它的定义是这样的:

public event EventHandler Closed
{add{}remove{}
}

坑爹啊。度娘了半天,终于找到下面的方法参考完成。

/// <summary>
/// 清除一个对象的某个事件所挂钩的delegate
/// </summary>
/// <param name="ctrl">控件对象</param>
/// <param name="eventName">事件名称,默认的</param>
public static void ClearEvents(this object ctrl, string eventName = "_EventAll")
{if (ctrl == null) return;BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Static;EventInfo[] events = ctrl.GetType().GetEvents(bindingFlags);if (events == null || events.Length < 1) return;for (int i = 0; i < events.Length; i++){try{EventInfo ei = events[i];//只删除指定的方法,默认是_EventAll,前面加_是为了和系统的区分,防以后雷同if (eventName != "_EventAll" && ei.Name != eventName) continue;/********************************************************* class的每个event都对应了一个同名(变了,前面加了Event前缀)的private的delegate类* 型成员变量(这点可以用Reflector证实)。因为private成* 员变量无法在基类中进行修改,所以为了能够拿到base * class中声明的事件,要从EventInfo的DeclaringType来获取* event对应的成员变量的FieldInfo并进行修改********************************************************/FieldInfo fi = ei.DeclaringType.GetField("Event_" + ei.Name, bindingFlags);if (fi != null){// 将event对应的字段设置成null即可清除所有挂钩在该event上的delegatefi.SetValue(ctrl, null);}}catch { }}
}

原来的代码中 ei.DeclaringType.GetField("Event_" + ei.Name, bindingFlags);的Event后面没有下划线,即写成了“Event”,执行时发现fi是空。参考上面的代码“_EventAll”,加一个下划线尝试。成功!
记录,以备后查。

_

相关文章:

memcached图形界面的监控

wget http://livebookmark.net/memcachephp/memcachephp.zip 前提是已经安装了php和memcached 图形界面的监控是通过memcache.php来实现的&#xff0c; 1&#xff0e;把该php程序拷贝到nginx的html根目录 [rootcacti srv]# cd /usr/local/nginx/html 2. 更改相应的连接IP和端口…

薅百度GPU羊毛!PaddlePaddle大升级,比Google更懂中文,打响AI开发者争夺战

记者 | 阿司匹林出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;深度学习已经推动人工智能进入工业大生产阶段&#xff0c;而深度学习框架则是智能时代的操作系统。在4月23日下午的Wave Summit深度学习开发者峰会上&#xff0c;百度高级副总裁王海峰开场就为深度学习…

vue中axios如何实现token验证

title: vue中axios如何实现token验证 date: 2018-02-08 17:50:07 tags: [axios,vue] 继上篇实现Auth认证之后,然后每个跳转页面都会在后端验证token的存在 然后那天晚上通过模仿Auth发送请求,发送成功(上篇末尾的方式) 但是今天再继续写,发现每个页面请求都要发送token验证 就比…

【视频】视频方面大神博客总结

1、雷霄骅博客 [总结]视音频编解码技术零基础学习方法&#xff1a;雷神对音视频技术的总结&#xff0c;包括&#xff1a;视频播放器原理、流媒体协议、封装格式、视频编码、音频编码、网络视音频平台对比。首先对雷神的顶礼膜拜&#xff0c;学完这篇博客&#xff0c;就算跨入音…

IHttpHandler 在SharePoint中的应用

1. 一个文件名为VCChartHandler.ashx&#xff0c;其文件代码为: <% WebHandler Language"C#" Class"VCSharePoint.BL.VCHandler,VCSharePoint, Version1.0.0.0, Cultureneutral, PublicKeyToken0134fd28ed40d3b2"%>2. 另一个类为VCHandler.cs的文件…

普通人也能用AI拍出3D大片?这位清华博士后这么做

从《阿凡达》到《流浪地球》&#xff0c;从好莱坞科幻 3D 电影之最到中国科幻 3D 电影之最&#xff0c;从 2009 年到 2019 年&#xff0c;近十年的岁月&#xff0c;见证了中国 3D 影视制作的快速成长和繁盛&#xff0c;也刺激着赵天奇探索人工智能与影视制作结合应用的信心。影…

[asp.net core]SignalR一个例子

摘要 在一个后台管理的页面想实时监控一些操作的数据&#xff0c;想到用signalR。 一个例子 asp.net coresignalR 使用Nuget安装包&#xff1a;Microsoft.AspNetCore.SignalR 在StartUp中启用signalR // This method gets called by the runtime. Use this method to add serv…

【FFmpeg】截至ffmpeg4.2不推荐(Deprecate)继续使用的接口,以及代替它的接口汇总

1、问题描述 使用ffmpeg库写程序,编译时,经常报警告“xxx is deprecated” 查看源码时,该接口或结构体字段被标记attribute_deprecated,表示它已经过时,不推荐使用。 如: attribute_deprecated void avcodec_register(AVCodec *codec);attribute_deprecated void avcod…

Asp.net开发过程中,我们会遇到很多Exception

在Asp.net开发过程中&#xff0c;我们会遇到很多Exception&#xff0c;不处理这些Exception的话会出现很难看的页面。还有一些我们未预料到的Exception&#xff0c;当发生Exception时&#xff0c;我们也必须进行记录具体位置&#xff0c;以便我们修正错误。asp.net异常处理的位…

【经验】对一个合格C++高级工程师(音视频方向)的要求

1、C高级工程师 经过查看招聘网站上对“C高级工程师”这个职位的招聘要求&#xff0c;只总结了技术、能力要求&#xff0c;不涉及工作年限、学历 具体要求如下&#xff1a; 精通C面向对象程序设计&#xff1b; 熟悉设计模式&#xff1b; 敏捷开发经验&#xff1b; 扎实数据结…

马云:腾讯不是阿里要打败的对手,是同为社会创造价值的伴侣

整理 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;在甘肃敦煌举办的 2019 年中国绿公司年会上&#xff0c;阿里巴巴创始人、董事局主席马云谈及企业间的竞争时&#xff0c;提到了与腾讯的关系。他表示&#xff0c;没有腾讯&#xff0c;阿里…

Win10 | Mac 在server上统一办公

一个非常实际的问题&#xff0c;通常我们主要有三个工作的地点&#xff1a;1&#xff0c;server&#xff0c;用于大型数据的分析和处理&#xff1b;2&#xff0c;办公室的电脑&#xff0c;正式办公&#xff1b;3.自己的电脑&#xff0c;偶尔加班。 不同的工作平台之间很难同步&…

JDK5.0新特性系列---目录

JDK5.0新特性系列---目录 JDK5.0新特性系列---1.自动装箱和拆箱 JDK5.0新特性系列---2.新的for循环 JDK5.0新特性系列---3.枚举类型 JDK5.0新特性系列---4.静态导入 JDK5.0新特性系列---5.可变长参数Varargs JDK5.0新特性系列---6.格式化输出 JDK5.0新特性系列---7.使用Proce…

怎样搞定分类表格数据?有人用TF2.0构建了一套神经网络 | 技术头条

作者 | 王树义来源 | 玉树芝兰&#xff08;ID&#xff1a;nkwangshuyi&#xff09;以客户流失数据为例&#xff0c;看 Tensorflow 2.0 版本如何帮助我们快速构建表格&#xff08;结构化&#xff09;数据的神经网络分类模型。变化表格数据&#xff0c;你应该并不陌生。毕竟&…

【FFmpeg】Hello World!尝试如何编译FFmpeg程序

1、说明 下面的例子只演示,编译FFmpeg时用的头文件和库,不涉及编解码,只调用一个可以打印编译FFmpeg库的配置项的接口:avcodec_configuration() 2、avCfg.c #include <stdio.h> #include <libavcodec/avcodec.h>int main(int argc,char *argv[]

x-pack watch邮件报警配置

参考网址&#xff1a; https://www.cnblogs.com/reboot51/p/8328720.html https://www.elastic.co/guide/en/x-pack/5.6/actions-email.html #邮件设置 elasticsearch 配置 xpack.notification.email.account:exchange_account:profile: outlookemail_defaults:from: infomail.…

虚拟桌面的备份恢复最佳实践 第一部分

摘要 VMware View 是目前虚拟桌面市场的旗舰产品。借助它&#xff0c;企业可以将办公系统、应用和基础架构以高性能、高度可扩展的集中式托管服务形式交付给用户。View 还可提供保护它所支持的系统和应用以及相关用户数据所需的功能。它支持方便地备份和还原存档数据。 通常&…

Python程序员Debug利器,和Print说再见 | 技术头条

整理 | Rachel责编 | Jane出品 | Python大本营&#xff08;id&#xff1a;pythonnews&#xff09;【导语】程序员每日都在和 debug 相伴。新手程序员需要学习的 debug 手段复杂多样&#xff0c;设置断点、查看变量值……一些网站还专门针对debug撰写了新手教程。老司机们在大型…

【FFmpeg】解决警告warning: xxx is deprecated [-Wdeprecated-declarations]的方法

1、问题描述 编译FFmpeg程序时,经常报一些关于“deprecated”的警告信息,具体内容如下: decode.cpp:28:2: warning: ‘void av_register_all()’ is deprecated [-Wdeprecated-declarations]av_register_all(); decode.<

[BZOJ2527]Meteors

整体二分挺好玩的...学一发 这个询问显然是可以二分的&#xff0c;但每次都二分就会T爆&#xff0c;所以我们有了“整体”二分 每次处理一些询问&#xff0c;要求这些询问的答案一定在$[l,r]$中 先把$l$到$mid$的操作实施&#xff0c;那么当前TAK的询问答案一定在$[l,mid]$中&a…

一个可提供html5制作服务的网站

2019独角兽企业重金招聘Python工程师标准>>> 【TechWeb报道】最近网上出现了一个专门基于HTML5/CSS3制作服务的组织 P2H.cn. 就是专门提供网站切图的一项服务。特别在哪儿呢 &#xff0c;P2H.cn 可以制作出完美的兼容的html5/css3的页面。 王大利/文 如果你不知…

【Ubuntu】Ubuntu下的录频软件SimpleScreenRecorder

1、说明 官网介绍&#xff1a;https://www.maartenbaert.be/simplescreenrecorder/ 源码参见github&#xff1a;https://github.com/MaartenBaert/ssr 2、安装 Ubuntu版本>17.04&#xff0c;直接安装 sudo apt-get install simplescreenrecorderUbuntu版本<17.04&…

打开阿兹海默之门:华裔张复伦利用RNN成功解码脑电波,合成语音 | Nature

作者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019 年 4 月 24 日&#xff0c;来自加州大学旧金山分校&#xff08;UCSF&#xff09;神经外科学系 Gopala K. Anumanchipalli&#xff0c;Josh Chartier&#xff0c;Edward F. Chang 团队在 Nature 杂志上…

[转载] 别人的心得感悟

原文&#xff1a; https://www.cnblogs.com/double-K/p/6926367.html#commentform ---------------------------------------- 不可说的感悟-——十年老技术转型&#xff08;一&#xff09; 佛曰&#xff1a;“不可说&#xff0c;说既是错”&#xff0c;所以本篇也是错&#xf…

Windows Phone 7、XNA的旋转的背景

在游戏表现的过程中需要一些比较酷的动作&#xff0c;我们需要通过图型与XNA中的一些代码来实现&#xff0c;比如我们要说到的一个360度转动的圆。 在手机上的效果如下: 当然在这里我们看不到转动的效果&#xff0c;下边提供的有源码&#xff0c;大家可以下载运行测试一下。 操…

【Qt】报错error: undefined reference to `vtable for的解决方法

1、问题描述 编译Qt程序时&#xff0c;在某个类构造函数定义处报错&#xff1a; error: undefined reference to vtable for2、原因分析 导致错误信息的原因是&#xff1a;子类没有实现父类的纯虚函数&#xff1b; 在Qt中&#xff0c;首先要想到的是在一个类中添加了新的继承…

110万开发者的福音,百度Easy DL商品检测专业版上线

继首场百度大脑开放日上一口气开放24项全新AI技术后&#xff0c;4 月 25 日下午&#xff0c;第二期百度大脑开放日如约举行&#xff0c;本次共发布了13款AI通用新能力、5项技术升级&#xff0c;并推出了EasyDL商品检测专业版和语音识别自训练平台两大全新的可定制训练平台。 实…

简单爬虫学习记录

实现思路解析&#xff1a;爬虫调度器&#xff1a;启动/停止爬虫&#xff0c;规定爬虫的范围&#xff1b;URL管理器&#xff1a;管理2个URL&#xff1a;新的没有爬过的urls&#xff1b;旧的爬过的urls&#xff1b;URL下载器&#xff1a;下载url对应的html数据&#xff1b;HTML解…

开启笔记本win7的虚拟热点,让你的本本变成wifi

写在前面&#xff1a;相信很多人都跟我一样有困扰&#xff0c;在学校用校园网不能wifi&#xff0c;所以在此提供一个教程&#xff0c;希望能给机友们一些帮助。帖子转自网络&#xff0c;自己也测试过了。分享给大家&#xff0c;希望能给大家带来一些方便。开启windows 7的隐藏功…

检测到包降级: Microsoft.Extensions.Configuration.Abstractions 从 2.1.1 降 2.1.0

解决方法&#xff1a;工具-nuget管理包-程序管理控制台-选择 项目- 执行 -Install-Package Microsoft.Extensions.Configuration.Abstractions -Version 2.1.1命令即可。 转载于:https://www.cnblogs.com/dashanboke/p/9229826.html