我正在尝试设置一个允许打开同一窗口(shell)的多个实例的应用程序。我有一个主shell(由Bootstrapper设置),我从中打开我的第二个shell的新实例。第二个shell包含几个区域。
现在有一个问题,因为给定的区域每个应用程序(或RegionManager)只能出现一次,所以我尝试给每个shell自己的RegionManager。这似乎工作正常,但我也使用Unity将RegionManager注入我的ViewModels / Controllers,这意味着我总是得到主shell的实例,而不是绑定到ViewModel所属的shell的实例。
以某种方式可以使这项工作成功吗?对于我的用例,这甚至是正确的方法吗?
答案 0 :(得分:2)
您可以使用作用域区域和自定义对话框服务来解决此问题。
我真的建议在Prism Problems & Solutions: Showing Multiple Shells关于这个主题的Brian Lagunas的PluralSight课程中查看一些很好的深入细节,这也是这个解决方案的衍生地。
为了让您开始考虑以下服务:
public interface IShellService
{
void ShowShell();
}
public class ShellService : IShellService
{
private IUnityContainer _unityContainer;
private IRegionManager _regionManager;
public ShellService(IUnityContainer unityContainer, IRegionManager regionManager)
{
_unityContainer = unityContainer;
_regionManager = _regionManager;
}
public void ShowShell()
{
shell = _container.Resolve<Shell>();
var scopedRegion = _regionManager.CreateRegionManager();
RegionManager.SetRegionManager(shell, scopedRegion);
shell.Show();
}
}
假设您正在使用Unity,那么您需要使用ContainerControlledLifeTimeManager
注册IShellService,这将告诉您的容器保留发送给它的实例(基本上使其成为单例)。
Container.RegisterType<IShellService, ShellService>(new ContainerControlledLifeTimeManager());
然后,只需在需要打开新shell的地方注入IShellService,然后在其上调用ShowShell()
。
private void ExecuteShowShellCommand()
{
_shellService.ShowShell();
}
答案 1 :(得分:2)
有几种方法可以解决这个问题。可能最简单的方法是使用Scoped RegionManager: https://msdn.microsoft.com/en-us/library/ff921162.aspx http://southworks.com/blog/2011/11/30/prism-region-navigation-and-scoped-regions/
另一个是你可以将IRegionManager的命名实例(每个shell窗口一个)注册到容器中,并按名称解析它们。只有在依赖于那些命名实例的ViewModel / Services只能在一个Window或另一个Window中创建时,这才真正有效。
另一种方法是为每个窗口创建一个子容器,并将一个单独的RegionManager实例注册到每个子容器中,以便尝试解析窗口中的实例与该窗口的区域管理器相对。
答案 2 :(得分:2)
显示多个shell实际上比首次出现的更多。这就是为什么我创建了一个Pluralsight课程,告诉你如何做到这一点,并指出&#34;陷阱&#34;在这个过程中。
http://www.pluralsight.com/courses/prism-showing-multiple-shells