我对WPF比较陌生,有些东西对我来说很陌生。首先,与Windows窗体不同,WPF控件层次结构不支持IDisposable。在Windows窗体中,如果用户控件使用任何托管资源,则通过覆盖每个控件实现的Dispose方法来清理资源非常容易。正确清理WPF用户控件
在WPF中,故事并不那么简单。我已经搜索了几个小时,并且遇到了两个基本主题:
第一个主题是Microsoft明确指出WPF没有实现IDisposable,因为WPF控件没有非托管资源。虽然这可能是事实,但他们似乎完全错过了WPF类层次结构的用户扩展实际上可能使用托管资源(直接或间接通过模型)的事实。通过不实现IDisposable,Microsoft已经有效地移除了唯一可以保证自定义WPF控件或窗口使用的非托管资源得到清理的机制。
其次,我发现Dispatcher.ShutdownStarted几个引用。我试图使用ShutdownStarted事件,但它似乎并没有为每个控件触发。我有一堆WPF UserControl,我已经为ShutdownStarted实现了一个处理程序,并且它永远不会被调用。我不确定它是否仅适用于Windows,或者WPF App类。然而,它并没有正确启动,每次关闭应用程序时我都会打开PerformanceCounter对象。
是否有比Dispatcher.ShutdownStarted事件清理非托管资源更好的选择?是否有一些技巧来实现IDisposable,以便Dispose被调用?如果可能的话,我更希望避免使用终结器。
+1用于将一次性资源移出代码隐藏。 WPF的关键学习点之一是最大限度地减少代码隐藏,以充分利用数据绑定架构的优势和表现力。学习是一件痛苦的事情(学习曲线更像攀登悬崖),但是当你“获得”WPF思维模式时会有所收获。 – 2009-10-11 13:22:09
所有可支配资源都在ViewModel中,它们本身是IDisposable。我真的很困惑为什么Dispatcher.ShutdownStarted事件不会触发。性能计数器控件(及其关联的ViewModel)确实附加到WPF图形中,因为它嵌入在的中。 –
jrista
2009-10-11 19:00:14
@Greg D:我通常会得到WPF模型。我一掌握了WPF的基础知识,就开始使用MVVM,并且我的CodeBehind几乎和它一样纯粹(仅仅是默认构造函数和对InitializeComponent的调用)。 WPF的可组合性和数据绑定功能非常出色,如果我有选择,我永远不会回到Windows窗体。 – jrista 2009-10-11 19:02:13