Prism:如何从内存

时间:2015-12-09 09:37:29

标签: c# wpf mvvm prism

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

我真的很喜欢在内存中加载现有视图这一事实。但在某些时候我想彻底销毁( Garbage Collected )现有视图,并希望加载新的新视图。

示例方案

例如,有一个" CustomerList"查看显示带有电子邮件地址的客户列表。当我点击列表中的一个客户时,新的" SendEmail"将加载带有填充电子邮件地址的视图。当我点击取消时,它将返回" CustomerList"视图。

当我再次单击列表中的同一客户时,它将显示" SendEmail"视图实例已经存在于内存中。

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

问题

我知道可以使用IsNavigationTarget界面中的INavigationAware方法解决此问题。但 Prism 只需创建新的" SendEmail"查看实例,不要删除现有的" SendEmail"从记忆中查看。在我的假设中(不确定),创建新的View实例(不删除旧的实例)会不必要地使内存膨胀。

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

为什么IRegionMemberLifetime不是答案?

KeepAlive的{​​{1}}属性可以强制取消视图,并在视图导航离开时从区域中删除。但是IRegionMemberLifetime属性是KeepAlive属性,并且自创建View实例以来必须设置readonlytrue

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

1 个答案:

答案 0 :(得分:0)

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

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