【问题标题】:Prism 4 RegionManager loses first region when second one is added in WPF在 WPF 中添加第二个区域时,Prism 4 RegionManager 丢失第一个区域
【发布时间】:2011-05-16 18:45:32
【问题描述】:

我们正在使用 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 拒绝保存区域集合一样。应该说这是我第一次涉足温莎城堡和棱镜,所以我在这里遗漏了一些令人痛苦的明显东西并不是不可能的。任何可能对此有所了解的信息都会非常有帮助。

【问题讨论】:

    标签: c# wpf prism castle-windsor


    【解决方案1】:

    您确定要向 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

    编辑

    我查看了示例解决方案(cmets 中的链接),发现您的视图注入代码在创建主视图之前执行。您的模块初始化程序在 StartRuntime->CreatePrismBootStrapper 中被调用,而 DisplayRootView(它会创建您的 shell)稍后会被调用。当然在shell还没有创建的时候是找不到region的。

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

    您有多种选择:

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

    2. 在加载模块之前创建并注册您的 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;
    }
    

    .3。在 base.DisplayRootView 之后 CreatePrismBootstrapper() ?它不起作用(ServiceLocator 上的 NullPointerException,我不确定这是否有意义,因为我不太熟悉您使用的库,除了 Prism...

    希望对你有帮助……

    【讨论】:

    • 有一个MainShellView,就是应用的Shell。 MainShellView 内部是一个 MainSiteView,它是一个 UserControl,其中包含上面引用的 DockPanel。该 DockPanel 然后包含两个 ContentControl。至于 RegionManager,它是在 MainSiteView 上注册的,而不是在 MainShellView 上,如果这对事情有任何影响的话。如果它在 MainShellView 上注册它没有找到任何区域,在 MainSiteView 上注册它会表现出所描述的行为。
    • 您确定不嵌套您的区域吗?尝试向 DockPanel 添加一个简单的控件,看看添加区域后它是否仍然存在。也许当添加第二个区域时,它会从 DockPanel 中删除所有其他控件,就好像 DockPanel 是实际区域一样?
    • 这是层次结构:我们的 MainWindow 是我们在引导程序中手动创建的 Actipro RibbonWindow。 MainWindow 的内容设置为 MainShellView,这是一个 UserControl,它有两个重叠的 ContentControl,一个用于 Workspace,另一个用于 Dialogs。 Workspace ContentControl 在启动时设置为 MainSiteView。 MainSiteView 有两个 ContentControl,一个是 ToolBarRegion,一个是 WorkspaceRegion。我试过用 MainWindow、MainShellView 和 MainSiteView 注册 RM,但总是遇到这个问题。一个区域有效,两个区域失败。
    • 您是否尝试在 xaml 中插入 2 个区域但注释掉此 _regionManager.Regions[RegionNames.WorkspaceRegion].Add(typeof(SomeOtherView)); ?结果是什么?还要检查您的常量值 RegionNames.WorkspaceRegion 是否存在复制/粘贴错误(“ToolBarRegion”?)
    • 我已经三次检查了复制/粘贴错误,因此可以排除这些错误。当我注释掉 _regionManager 代码,并在 XAML 中留下两个 ContentControl,每个都有各自的 RegionName 与之关联时,我得到一个带有两个空内容控件的 shell。因此,如果您想这样称呼它,那就“有效”。只有当我尝试实际引用它爆炸的第一个区域时。
    猜你喜欢
    • 2016-07-29
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多