从区域中删除视图后,不会释放视图

本文关键字:视图 释放 删除 区域 | 更新日期: 2023-09-27 18:33:43

向应用程序添加选项卡 我意识到我的子视图在我从Region中删除后没有被释放(最终确定(。

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

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

甚至

 [RegionMemberLifetime(KeepAlive = false)]

将把它从Region中移除,但物体仍然活着。

从区域中删除视图后,不会释放视图

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

在使用区域管理器添加新区域之前,请使用以下命令检查它是否尚不存在:

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

然后,当我从区域中删除视图时,我只是调用垃圾收集器 GC。Collect(( 方法来"释放"已删除的视图和释放内存。

但是,请确保在视图上使用属性 [RegionMemberLifetime(KeepAlive = false(]。

有关更多信息,请参阅此帖子

编辑

另一种解决方案,使用一次性模式,我也用于某些视图。

在我的视图实现 IDisposable 接口的地方,该方法如下所示:

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

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

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

请注意,我使用的是 mvvm 模式,我不必释放任何其他托管对象,否则,如果您的视图中有一些托管对象,请在此处查看有关 IDisposable 模式的更多信息