C# 删除时取消订阅FrameworkElement事件

C# 删除时取消订阅FrameworkElement事件,c#,wpf,events,memory-leaks,C#,Wpf,Events,Memory Leaks,我有一个附加属性,我在整个应用程序的一组控件上使用它。此属性订阅静态事件,并具有一个事件处理程序,可在其中修改附加属性绑定到的控件的某些属性 问题是其中一些控件被重新创建(例如,它们是ItemsControl或可以关闭和重新打开的窗口的一部分),然后通过附加属性保存在内存中。在我的WinForms版本中,我订阅了disposed事件,以便控件知道它何时被删除,然后取消订阅事件处理程序。但是,WPF没有这样的事件。已卸载,临时删除时会调用它(如通过选项卡控件更改选项卡) 那么,当应该移除控件以避免

我有一个附加属性,我在整个应用程序的一组控件上使用它。此属性订阅静态事件,并具有一个事件处理程序,可在其中修改附加属性绑定到的控件的某些属性

问题是其中一些控件被重新创建(例如,它们是ItemsControl或可以关闭和重新打开的窗口的一部分),然后通过附加属性保存在内存中。在我的WinForms版本中,我订阅了disposed事件,以便控件知道它何时被删除,然后取消订阅事件处理程序。但是,WPF没有这样的事件。已卸载,临时删除时会调用它(如通过选项卡控件更改选项卡)


那么,当应该移除控件以避免内存泄漏时,如何移除这些控件引用呢?目前,如果我刷新其中一个页面,我的应用程序使用的内存会不断增加。

我找到了一个似乎有效的解决方案。我没有保存对控件的引用,而是在WeakReference对象中设置它,以允许垃圾收集器收集它。

可能是FrameworkElement。Unload是取消订阅其他事件的地方!正如我提到的,卸载的事件是不可靠的。官方的dokumentation甚至提到,在控件的整个生命周期中,可以出于多种原因调用它?或者使用弱引用。