如何取消初始化FrameworkElement?

时间:2014-12-18 11:56:11

标签: c# wpf frameworkelement

我们有一个派生自FrameworkElement的类,它不在我们的控制之下。 该类在OnInitialize方法中注册事件处理程序。

正确清理此类的模式是什么,因为FrameworkElement不提供OnInitialize的对应项?

它仍然有根,因为它的任何部分都不会删除导致泄漏的EventHandler。

3 个答案:

答案 0 :(得分:3)

没有“去初始化”这样的东西。当无法在其构造函数中完全初始化对象时,将使用初始化方法,因为它依赖于构造期间不可用的数据。在这些情况下,构造分为两个阶段:第一步在无参数构造函数中执行,第二步在初始化方法中执行,如OnInitialize,在外部数据可用后

您描述的是对象处理,它通过调用对象的Dispose方法来执行。一个编写良好的类应该清理其数据,释放任何外部资源释放任何事件处理程序。

视觉元素通常在其生命周期中有另一个步骤,由OnLoad / OnUnload方法处理。当元素实际放置在XAML视图中并连接到其他UI元素时,会发生“加载”步骤。事件处理程序应在OnLoad方法中注册,并在OnUnload方法中删除。

如果元素没有Dispose方法,你可以引发Unload事件来强制清除,虽然这有点像黑客攻击:

control.RaiseEvent(new RoutedEventArgs(FrameworkElement.UloadedEvent))

答案 1 :(得分:1)

使用弱事件模式。特别是,使用WeakEventManager实现订阅事件(或者,更好的是,它的通用版本WeakEventManager<TEventSource, TEventArgs>,如果.NET 4.5是一个选项)。

答案 2 :(得分:0)

使用 Dispatcher.ShutdownStarted 事件。

将其添加到构造函数中:

Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;

并将您的清理代码添加到此方法中:

private void Dispatcher_ShutdownStarted(object sender, EventArgs e)
{
    Stop();
}