【问题标题】:Prism: How to remove existing View instance from memoryPrism:如何从内存中删除现有的 View 实例
【发布时间】:2016-03-14 12:27:54
【问题描述】:

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

我真的很喜欢在内存中加载现有视图。但是在某个时候我想完全销毁(Garbage Collected)现有视图并想加载新的新视图。

示例场景

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

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

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

问题

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

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

为什么IRegionMemberLifetime 不是答案?

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

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

【问题讨论】:

  • IRegionMemberLifetime 接口和 KeepAlive 属性怎么样?
  • @galakt 请看我的编辑。

标签: c# wpf mvvm prism


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多