目录
介绍
使用代码
兴趣点
如果您需要清理事件,此代码段将为您提供帮助。通常,您必须使用+=或-=,或者使用WeakEventHandler().AddHandler或RemoveHandler。但有时,您可能需要更难的方法!
介绍我们需要在关闭窗口时清理WPF可视化树。为此,我们在Window组件上开发了WPF行为。
关闭时,此行为刚刚穿过窗口的可视化树。采取每个组件并为此:
- 清除所有绑定
- 清除所有事件监听器(静态或非静态)
- 设置dataContext为null
这有助于GC快速收集...
使用代码执行清除事件部分的代码如下:
public static void ClearEvents(object instance)
{
var eventsToClear = instance.GetType().GetEvents(
BindingFlags.Public | BindingFlags.NonPublic
| BindingFlags.Instance | BindingFlags.Static);
foreach (var eventInfo in eventsToClear)
{
var fieldInfo = instance.GetType().GetField(
eventInfo.Name,
BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
if (fieldInfo.GetValue(instance) is Delegate eventHandler)
foreach (var invocatedDelegate in eventHandler.GetInvocationList())
eventInfo.GetRemoveMethod(fieldInfo.IsPrivate).Invoke(
instance,
new object[] { invocatedDelegate });
}
}
反射是一个非常强大的工具,但这一定不是主要的方式。这只能在关键场景中使用。
https://www.codeproject.com/Tips/5313978/Clear-All-Events-Listeners-of-an-Instance-or-Stati