我们正在使用Castle Windsor和Prism 4(2010年2月)。我们正在使用Windsor引导程序,使得Castle在CompositeWPFContrib软件包中发布的Prism很好用。
我正在尝试在我的主要Shell的XAML上定义区域。如果我定义一个区域,就像这样:
<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.ToolBarRegion}"
DockPanel.Dock="Top"/>
然后在我的一个模块初始化方法中执行以下操作:
_regionManager.Regions[RegionNames.ToolBarRegion].Add(typeof(SomeView));
......生活很美好。
但是,只要我在Shell的XAML中添加另一个区域:
<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.WorkspaceRegion}"
DockPanel.Dock="Bottom"/>
然后做:
_regionManager.Regions[RegionNames.WorkspaceRegion].Add(typeof(SomeOtherView));
...我收到错误:“区域管理器不包含ToolBarRegion区域。”
是什么给出的?一旦我注释掉第二个区域,它就会找到第一个区域,当我将第二个区域添加回来时,就好像RegionManager拒绝保存一组区域一样。应该说这是我第一次涉足温莎城堡和棱镜,所以我在这里错过了一些非常明显的东西并不是出于可能性的范围。任何可以解决的问题都是最有帮助的。
答案 0 :(得分:0)
你确定你要将控件添加到DockPanel吗?也许你的容器本身就是一个内容控件(一种只接受一个孩子的控件)?
此外,您可以尝试在引导程序中注册您的区域管理器:
RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>());
请参阅以下问题:
Cannot find Region in RegionManager (using PRISM)
WPF, Prism v2, Region in a modal dialog, add region in code behind
修改强>
我查看了示例解决方案(评论中的链接),发现您的视图注入代码在创建主视图之前执行。您的模块初始值设定项在StartRuntime-&gt; CreatePrismBootStrapper中调用,而DisplayRootView(创建您的shell)稍后会被调用。当然,在尚未创建shell时无法找到该区域。
如果您只想在模块初始化代码中注册子控件,则视图发现更合适 - 它不需要已创建shell 。当您需要根据用户输入切换视图时,查看注入会更好(在这种情况下,确保已注册包含控件取决于您)。
您有几种选择:
使用视图发现 - 就像您在示例解决方案中所做的那样。
在加载模块之前创建并注册Shell实例。 base.DisplayRootView()应该能够在容器中找到它,所以它不会创建另一个。一种方法,但我不确定是否最好:
PrismBootstrapper.cs:
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;
}
0.3。 base.DisplayRootView之后的CreatePrismBootstrapper()?它不起作用(ServiceLocator上的NullPointerException,我不确定它是否有意义,因为除了Prism之外,我并不熟悉你使用的库...
希望这会有所帮助......