如何取消初始化 FrameworkElement
本文关键字:初始化 FrameworkElement 取消 何取消 | 更新日期: 2023-09-27 18:34:32
我们有一个从FrameworkElement派生的类,它不受我们的控制。此类在 OnInitialize 方法中注册事件处理程序。
正确清理此类的模式是什么,因为 FrameworkElement 不提供与 OnInitialize 对应的模式?
它保持根,因为它的任何部分都不会删除导致泄漏的事件处理程序。
没有"取消初始化"这样的事情。当无法在其构造函数中完全初始化对象时,将使用初始化方法,因为它依赖于构造期间不可用的数据。在这些情况下,构造分为两个阶段:第一步在无参数构造函数中执行,第二步在初始化方法中执行,如OnInitialize
,在外部数据可用后
您描述的是对象处置,它是通过调用对象的 Dispose
方法来执行的。一个写得很好的类应该清理其数据,释放任何外部资源并释放任何事件处理程序。
可视元素在其生命周期中通常有另一个步骤,由 OnLoad/OnUnload 方法处理。当元素实际放置在 XAML 视图中并连接到其他 UI 元素时,将发生加载步骤。事件处理程序应在 OnLoad 方法中注册,并在 OnUnload 方法中删除。
如果元素没有Dispose
方法,您可以引发 Unload 事件来强制清理,尽管这有点黑客:
control.RaiseEvent(new RoutedEventArgs(FrameworkElement.UloadedEvent))
使用弱事件模式。特别是,使用 WeakEventManager
实现订阅事件(或者,如果可以选择 .NET 4.5,则最好是其通用版本 WeakEventManager<TEventSource, TEventArgs>
(。
使用Dispatcher.ShutdownStarted
事件。
将此添加到构造函数中:
Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
并将清理代码添加到此方法中:
private void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
Stop();
}