从区域中删除视图后不会丢弃视图

时间:2014-12-08 14:51:12

标签: c# wpf object prism

向应用程序添加选项卡我意识到在从Region中删除它后,我的子视图不会被处理(最终确定)。

 regionManager.Regions[regionName].Remove(tabItem.Content);

每次关闭Tab并重新打开它,都会正确创建一个新实例,但旧实例会一直打开,直到我关闭应用程序。通过Finalizer断点检查它。这导致我的应用程序在Region尝试创建已存在的区域时不释放RegionManager并崩溃。

甚至

 [RegionMemberLifetime(KeepAlive = false)]

会将其从Region中删除,但该对象仍然有效。

1 个答案:

答案 0 :(得分:2)

我有一个类似的问题,我今天早上才解决了。

在使用regionManager添加新Region之前,使用以下命令检查它是否已存在:

this.regionManager.Regions.ContainsRegionWithName("Your region name")

然后,当我从区域中删除视图时,我只是调用垃圾收集器GC.Collect()方法来“处理”已删除的视图和空闲内存。

但请确保在视图中使用属性 [RegionMemberLifetime(KeepAlive = false)]

有关详细信息,请参阅this post

修改

另一个解决方案,使用我也用于某些视图的Disposable模式。

我的视图实现了IDisposable接口,然后该方法如下所示:

public void Dispose()
        {
            GC.SuppressFinalize(this);  
        }

之后,当您从Region中删除视图时,只需调用Dispose方法:

myRegion.Deactivate(view);
myRegion.Remove(view);

var disposable = view as IDisposable;
if (disposable != null)
{
    disposable.Dispose();
}

请注意,我正在使用mvvm模式,而且我不必释放任何其他托管对象,否则,如果您的视图中有一些托管对象,请参阅有关IDisposable pattern here的更多信息