gpt4 book ai didi

wpf - 正确清理WPF用户控件

转载 作者:行者123 更新时间:2023-12-03 11:54:48 25 4
gpt4 key购买 nike

我对WPF相对陌生,它对我来说有些陌生。首先,与Windows窗体不同,WPF控件层次结构不支持IDisposable。在Windows窗体中,如果用户控件使用了任何托管资源,则通过覆盖每个控件实现的Dispose方法来清除资源非常容易。

在WPF中,故事并不那么简单。我已经搜索了几个小时,并且遇到了两个基本主题:

第一个主题是Microsoft明确声明WPF不会实现IDisposable,因为WPF控件没有不受管理的资源。尽管这可能是正确的,但他们似乎完全没有想到这样一个事实,即对其WPF类层次结构的用户扩展确实可以使用托管资源(直接或通过模型间接)。通过不实现IDisposable,Microsoft有效地删除了唯一有保证的机​​制,通过该机制可以清除自定义WPF控件或窗口使用的非托管资源。

其次,我找到了一些对Dispatcher.ShutdownStarted的引用。我尝试使用ShutdownStarted事件,但似乎并非为每个控件都触发。我有一堆WPF UserControl,我已经为ShutdownStarted实现了一个处理程序,但是它从未被调用过。我不确定它是否仅适用于Windows或WPF App类。但是,它不能正确触发,并且每次应用程序关闭时,我都会泄漏打开的PerformanceCounter对象。

是否有比Dispatcher.ShutdownStarted事件更好的替代方式来清除非托管资源?有实现IDisposable的技巧,以便调用Dispose吗?如果可能,我更愿意避免使用终结器

最佳答案

恐怕Dispatcher.ShutdownStarted确实确实是WPF提供的用于在UserControls中处置资源的唯一机制。 (请看我刚才问过的非常similar question)。

解决该问题的另一种方法是将所有可使用的资源(如果有可能)从代码后面移出并移入单独的类(例如使用MVVM模式时的ViewModel)。然后在更高级别上,您可以处理主窗口关闭并通过Messenger类通知所有ViewModel。

我很惊讶您没有收到Dispatcher.ShutdownStarted事件。您的UserControl当时是否已连接到顶层窗口?

关于wpf - 正确清理WPF用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1550212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com