c# - Prism:如何从内存中删除现有的 View 实例

标签 c# wpf mvvm prism

Prism 通常将 View 保存在内存中,并在使用 RegionManager.RequestNavigate 切换 View 时再次加载这些 View 。

我真的很喜欢在内存中加载现有 View 这一事实。但是在某些时候我想完全破坏(垃圾收集)现有 View 并想加载新的新 View 。

示例场景

例如,有一个“CustomerList” View 显示具有电子邮件地址的客户列表。当我单击列表中的一位客户时,将加载填充了电子邮件地址的新“SendEmail” View 。当我单击取消时,它将返回到“CustomerList” View 。

当我再次点击列表中的同一个客户时,它会显示内存中已经存在的“SendEmail” View 实例。

但是当我点击列表中的另一个客户时,程序应该删除内存中现有的“SendEmail” View 实例并创建新的“SendEmail” View 并填充电子邮件地址。

问题

我知道它可以通过 INavigationAware 接口(interface)中的 IsNavigationTarget 方法来解决。但是 Prism 只是创建新的“SendEmail” View 实例,并不从内存中删除现有的“SendEmail” View 。在我的假设中(不确定),创建新的 View 实例(不删除旧实例)会不必要地膨胀内存。

我应该如何解决这个问题或是否有其他解决方法?

为什么 IRegionMemberLifetime 不是答案?

IRegionMemberLifetime

KeepAlive 属性可以在 View 离开时强制 View 停用并从区域中移除。但是 KeepAlive 属性是 readonly 属性,并且必须在创建 View 实例后设置 truefalse

在我的问题中,我不想立即删除 View 一旦 View 被导航离开。 当 View 被导航离开时,我仍然希望将 View 保留在内存中。我只想在确定不再需要此 View 时删除该 View 。

最佳答案

所以基本上您要问的是,“我怎样才能删除 View ?”。您不知道何时删除它,但是当您准备好时需要将其删除?在这种情况下,您需要手动从区域中删除 View 。一种方法可能是在您准备好删除 View 时使用 EventAggregator 发布 RemoveEvent,然后对此做出响应。

另一种选择是创建自定义区域行为来监控 View 的生命周期并以这种方式进行管理。

关于c# - Prism:如何从内存中删除现有的 View 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175307/

相关文章:

mvvm - 具有复杂 MVVM(存储库 + 嵌套观察对象)的 SwiftUI

c# - 绑定(bind)到已设置选定项目的 View 模型时,无法让 telerik radgridview 突出显示 SelectedItem

c# - 嵌套用户控件的 WPF、MVVM 和事件处理

c# - 是否有可以帮助我捕获视频的 c# 网络摄像头/视频 WPF 组件?

c# - 从应用程序资源加载 .NET 程序集并从内存中运行它,但不终止主/主机应用程序

c# - 使用 VSTO c# 创建的 outlook 插件的 ProgID

c# - WPF MVVM 关于弹出搜索的建议

c# - 我想要将 Html 页面及其所有内容(即 .png、.gif 等图像)转换为具有相同外观和感觉的 MS Word 文档

c# - 在 WPF 中打印

c# - 使用方法 'mysql_native_password' 对主机或用户进行身份验证失败