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 实例后设置 true
或 false
。
在我的问题中,我不想立即删除 View 一旦 View 被导航离开。 当 View 被导航离开时,我仍然希望将 View 保留在内存中。我只想在确定不再需要此 View 时删除该 View 。
最佳答案
所以基本上您要问的是,“我怎样才能删除 View ?”。您不知道何时删除它,但是当您准备好时需要将其删除?在这种情况下,您需要手动从区域中删除 View 。一种方法可能是在您准备好删除 View 时使用 EventAggregator 发布 RemoveEvent,然后对此做出响应。
另一种选择是创建自定义区域行为来监控 View 的生命周期并以这种方式进行管理。
关于c# - Prism:如何从内存中删除现有的 View 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175307/