C# 在WPF中添加第二个区域时,Prism 4 RegionManager将丢失第一个区域
我们正在使用温莎城堡和棱镜4(2010年2月)。我们正在使用Windsor引导程序,使Castle与CompositeWPFContrib包中发布的Prism配合使用 我试图在主Shell的XAML上定义区域。如果我定义一个区域,如下所示:C# 在WPF中添加第二个区域时,Prism 4 RegionManager将丢失第一个区域,c#,wpf,prism,castle-windsor,C#,Wpf,Prism,Castle Windsor,我们正在使用温莎城堡和棱镜4(2010年2月)。我们正在使用Windsor引导程序,使Castle与CompositeWPFContrib包中发布的Prism配合使用 我试图在主Shell的XAML上定义区域。如果我定义一个区域,如下所示: <ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.ToolBarRegion}" DockPanel.Dock=
<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.ToolBarRegion}"
DockPanel.Dock="Top"/>
…生活是美好的
但是,只要我在Shell的XAML中添加另一个区域:
<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.WorkspaceRegion}"
DockPanel.Dock="Bottom"/>
…我得到错误:“区域管理器不包含工具栏区域。”
有什么好处?一旦我注释掉第二个区域,它就会找到第一个区域,当我将第二个区域添加回它时,它就会爆炸,就像RegionManager拒绝保存区域集合一样。应该说,这是我第一次涉足温莎城堡和棱镜城,所以我可能错过了一些非常明显的东西。任何关于这方面的信息都会非常有用。您确定要将控件添加到的是DockPanel吗?也许您的容器本身就是一个内容控件(一种只接受一个子控件的控件) 此外,您还可以尝试在引导程序中注册您的区域管理器:
RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>());
RegionManager.SetRegionManager(shell,this.Container.Resolve());
见以下问题:
编辑
我查看了示例解决方案(注释中的链接),发现视图注入代码在创建主视图之前执行。在StartRuntime->CreatePrismBootStrapper中调用模块初始值设定项,稍后调用DisplayRootView(创建shell)。当然,当外壳尚未创建时,它无法找到区域
如果您只想在模块初始化代码中注册子角色,则视图发现更合适—它不需要已经创建shell。当您需要根据用户输入切换视图时,视图注入会更好(在这种情况下,确保包含控件已注册取决于您)
您有几个选择:
protected override DependencyObject CreateShell()
{
Thor.Application.Views.ShellView view = new Thor.Application.Views.ShellView();
_container.Register(Castle.MicroKernel.Registration.Component.For<Thor.Application.Views.ShellView>().Instance(view));
// _container.Resolve<Thor.Application.Views.ShellView>();
return view;
}
protected override DependencyObject CreateShell()受保护的覆盖依赖对象
{
Thor.Application.Views.ShellView视图=新建Thor.Application.Views.ShellView();
_Register(Castle.MicroKernel.registation.Component.For().Instance(view));
//_container.Resolve();
返回视图;
}
.3。是否在base.DisplayRootView之后创建PrismBootStrapper()?它不起作用(ServiceLocator上的NullPointerException,我不确定它是否有意义,因为除了Prism之外,我对您使用的库不是很熟悉
希望这有帮助…有一个MainShellView,它是应用程序的外壳。在MainShellView中有一个MainSiteView,它是一个UserControl,它包含上面引用的DockPanel。该DockPanel然后包含两个ContentControl。至于RegionManager,它是在MainSiteView上注册的,而不是在MainShellView上注册的,如果是这样的话与任何事情都有关系。如果它在MainShellView上注册,它找不到任何区域,则在MainSiteView上注册它会显示所描述的行为。你确定你没有嵌套区域吗?尝试向DockPanel添加一个简单控件,并查看它在添加区域后是否保留在那里。可能在添加第二个区域后,它会被删除从DockPanel查看所有其他控件,就好像DockPanel是实际区域一样?继承人如下:我们的主窗口是我们在引导程序中手动创建的ActivPro RibbonWindow。主窗口的内容设置为MainShellView,这是一个用户控件,有两个重叠的ContentControl,一个用于工作区,另一个用于工作区对话框。工作区ContentControl在启动时设置为MainSiteView。MainSiteView有两个ContentControl,一个是ToolBarRegion,另一个是WorkspaceRegion。我曾尝试在MainWindow、MainShellView和MainSiteView中注册RM,但始终遇到此问题。一个区域有效,两个区域失败。您尝试过inse吗在xaml中RTIN 2个区域,但注释掉此
\u regionManager.regions[RegionNames.WorkspaceRegion].Add(typeof(SomeOtherView));
?结果如何?还要检查您的常量RegionNames.WorkspaceRegion是否存在复制/粘贴错误(“ToolBarRegion”?)我已经对复制/粘贴错误进行了三次检查,因此可以排除这些错误。当我注释掉_regionManager代码,并将两个ContentControl保留在XAML中,每个控件都与各自的RegionName关联时,我得到了一个包含两个空内容控件的shell。因此“有效,”如果你想这么说的话,只有当我试着引用第一个区域时,它才会爆炸。
RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>());
protected override DependencyObject CreateShell()
{
Thor.Application.Views.ShellView view = new Thor.Application.Views.ShellView();
_container.Register(Castle.MicroKernel.Registration.Component.For<Thor.Application.Views.ShellView>().Instance(view));
// _container.Resolve<Thor.Application.Views.ShellView>();
return view;
}