向应用程序添加选项卡我意识到在从Region
中删除它后,我的子视图不会被处理(最终确定)。
regionManager.Regions[regionName].Remove(tabItem.Content);
每次关闭Tab并重新打开它,都会正确创建一个新实例,但旧实例会一直打开,直到我关闭应用程序。通过Finalizer
断点检查它。这导致我的应用程序在Region
尝试创建已存在的区域时不释放RegionManager
并崩溃。
甚至
[RegionMemberLifetime(KeepAlive = false)]
会将其从Region
中删除,但该对象仍然有效。
答案 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的更多信息