我遇到了一个奇怪的问题,即通过 wpf 中的 MenuItem 发生内存泄漏。
我可以在 .net 内存分析器中观察到这种内存泄漏。
我们的应用程序具有以下架构:
一个 MainWindow,它的数据模板化 ApplicationPresenter。ApplicationPresenter 在应用程序的整个生命周期内持续存在。ApplicationPresenter 有一个 MainPresenter,它本质上代表一个文件及其内容。加载文件(解决方案)时,会创建一个新的主演示者并丢弃旧的主演示者。
应用程序演示者的数据模板如下所示:
<DataTemplate DataType="{x:Type ApplicationPresenter}">
<ContentPresenter Content="{Binding Presenter}"/>
</DataTemplate>
MainPresenter 有许多选项卡,但基本上它的数据模板是 DockPanel 内的一个大菜单。菜单有一些嵌套元素,例如文件、编辑、视图......在顶部和文件中你有新建、打开......然后是子菜单,如导入,然后它本身就有很多项目。
所有这些演示者都实现了 INotifyPropertyChanged,我们有一个 ICommand 的实现,它绕过了与之相关的疯狂(通常命令不会在应用程序中泄漏)。
但是我看到的是,当打开一个新的解决方案(或任何其他创建新 MainPresenter 的操作)时,原始的 MainPresenter(在应用程序加载时创建的第一个)通过 MenuItem 的 _submenuPopup 字段在内存中徘徊!我附上了分析器中的图片以帮助说明我的意思:
执行更多操作时,实例的数量不会超过两个,并且它始终是内存中的第一个 Presenter。菜单全部工作(包括子菜单中的项目)
有没有人熟悉这个问题并知道解决它的方法?
它不是非常关键,因为只有一种解决方案意味着它不会导致 OutOfMemoryException。但是它可能非常昂贵,因为可以通过双击文件来打开程序(这意味着第一个演示者可以保留大量数据),可能会不必要地增加一倍的内存使用量。