棱镜 4 区域管理器在 WPF 中添加第二个区域时丢失第一个区域

本文关键字:区域 第二个 第一个 添加 管理器 WPF 棱镜 | 更新日期: 2023-09-27 17:56:30

我们正在使用Castle Windsor和Prism 4(2010年2月)。 我们正在使用Windsor引导程序,它使Castle与CompositeWPFContrib包中发布的Prism很好地配合使用。

我正在尝试在主命令行管理程序的 XAML 上定义区域。 如果我定义一个区域,如下所示:

<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.ToolBarRegion}"
                    DockPanel.Dock="Top"/>

然后在我的模块初始化方法之一中执行以下操作:

_regionManager.Regions[RegionNames.ToolBarRegion].Add(typeof(SomeView));

。生活是美好的。

但是,只要我在命令行管理程序的 XAML 中添加另一个区域:

<ContentControl prism:RegionManager.RegionName="{x:Static core:RegionNames.WorkspaceRegion}"
                    DockPanel.Dock="Bottom"/>

然后做:

_regionManager.Regions[RegionNames.WorkspaceRegion].Add(typeof(SomeOtherView));

。我收到错误:"区域管理器不包含工具栏区域区域。

什么给? 一旦我注释掉第二个区域,它就会找到第一个区域,当我重新添加第二个区域时,它会爆炸,就好像区域管理器拒绝持有区域集合一样。 应该说,这是我第一次涉足温莎城堡和棱镜,所以我在这里错过了一些非常明显的东西并不是没有可能。 对此的任何了解都将是最有帮助的。

棱镜 4 区域管理器在 WPF 中添加第二个区域时丢失第一个区域

您确定要添加控件的是 DockPanel 吗?也许您的容器本身就是内容控件(一种只接受一个子控件的控件)?

此外,您可以尝试在引导程序中注册区域管理器:

RegionManager.SetRegionManager(shell, this.Container.Resolve<IRegionManager>());

请参阅以下问题:

在区域管理器中找不到区域(使用 PRISM)

WPF,棱镜 v2,模式对话框中的区域,在代码后面添加区域

编辑

我查看了示例解决方案(注释中的链接),发现您的视图注入代码在创建主视图之前执行。您的模块初始值设定项在 StartRuntime->CreatePrismBootStrapper 中调用,稍后调用 DisplayRootView(创建您的 shell)。当然,当外壳尚未创建时,它找不到该区域。

如果你想在模块初始化代码中注册你的子控件,视图发现更合适 - 它不需要你的 shell 已经创建。当您需要根据用户输入切换视图时,视图注入会更好(在这种情况下,请确保已注册包含控件由您决定)。

您有以下几种选择:

  1. 使用视图发现 - 就像在示例解决方案中所做的那样。

  2. 在加载模块之前创建并注册 Shell 实例。 基地。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;
}
.

3.CreatePrismBootstrapper() 在 base 之后。显示根视图 ?它不起作用(服务定位器上的 NullPointerException,我不确定它是否有意义,因为我不太熟悉你使用的库,除了棱镜......

希望这有帮助...