Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中添加第二个区域时,Prism 4 RegionManager将丢失第一个区域_C#_Wpf_Prism_Castle Windsor - Fatal编程技术网

C# 在WPF中添加第二个区域时,Prism 4 RegionManager将丢失第一个区域

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=

我们正在使用温莎城堡和棱镜4(2010年2月)。我们正在使用Windsor引导程序,使Castle与CompositeWPFContrib包中发布的Prism配合使用

我试图在主Shell的XAML上定义区域。如果我定义一个区域,如下所示:

<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。当您需要根据用户输入切换视图时,视图注入会更好(在这种情况下,确保包含控件已注册取决于您)

您有几个选择:

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

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