我使用 WPF、.Net 4、Prism 4.1 和 Unity 构建了一个 Prism 应用程序。我正在使用 DirectoryModuleCatalog 在运行时查找模块。我的视图显示在 TabControl (MainRegion) 中。当我从该区域中删除视图时,视图和视图模型仍保留在内存中并且永远不会被垃圾收集 - tabitem 被删除。经过几个小时的搜索,我无法弄清楚我做错了什么。
这是我的引导程序:
public class Bootstrapper : UnityBootstrapper
{
protected override void InitializeShell()
{
base.InitializeShell();
App.Current.MainWindow = (Window)Shell;
App.Current.MainWindow.Show();
}
protected override DependencyObject CreateShell()
{
var shell = new Shell();
return shell;
}
protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
}
}
这是我的模块:
[Module(ModuleName = "ModuleA")]
public class Module : IModule
{
private IRegionManager _regionManager;
public Module(IRegionManager regionManager)
{
_regionManager = regionManager;
}
public void Initialize()
{
var view = new UserControl1();
//_regionManager.RegisterViewWithRegion("MainRegion", typeof(UserControl1));
_regionManager.Regions["MainRegion"].Add(view, "ModuleA");
_regionManager.Regions["MainRegion"].Activate(view);
}
}
这是添加到该区域的我的视图的视图模型:
public class ViewModel
{
public DelegateCommand RemoveView { get; set; }
public ViewModel()
{
RemoveView = new DelegateCommand(() =>
{
var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
var view = regionManager.Regions["MainRegion"].GetView("ModuleA");
regionManager.Regions["MainRegion"].Deactivate(view);
regionManager.Regions["MainRegion"].Remove(view);
});
}
}
这是视图背后的代码:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
我读过这可能是因为我正在实例化模块中的视图,或者可能是视图中的视图模型?当我使用 Red Gate Memory Profiler 并通过 DelegateCommand 删除视图时,视图和视图模型都被标记为无法进行垃圾收集。我没有正确切割的参考在哪里?
这是来自 Ants 的保留图:https ://docs.google.com/file/d/0B4XjO9pUQxBXbGFHS1luNUtyOTg/edit?usp=sharing
这是一个显示问题的测试解决方案。
另外,我也在CodePlex上发布了这个问题。