Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
在运行时添加复合WPF区域_Wpf_Mvvm_Prism_Region - Fatal编程技术网

在运行时添加复合WPF区域

在运行时添加复合WPF区域,wpf,mvvm,prism,region,Wpf,Mvvm,Prism,Region,好的,这是我的简单场景。我有一组字符串,绑定到TabControl作为概念证明。当我添加字符串时,我需要一个以区域名称作为标题的新选项卡,以及选项卡容器中的ItemsControl。该ItemsControl应定义一个新区域 <TabControl x:Name="tabDemo" ItemsSource="{Binding DynamicRegions}" > <TabControl.ItemTemplate>

好的,这是我的简单场景。我有一组字符串,绑定到TabControl作为概念证明。当我添加字符串时,我需要一个以区域名称作为标题的新选项卡,以及选项卡容器中的ItemsControl。该ItemsControl应定义一个新区域

        <TabControl  x:Name="tabDemo" ItemsSource="{Binding DynamicRegions}" >
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ItemsControl cal:RegionManager.RegionName="{Binding}" ItemsSource="{x:Null}">

                </ItemsControl>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>
它会引发区域不存在的异常,或者引发创建区域失败且已设置my ItemsControl.ItemsSource的异常。我真的没料到这是开箱即用的,但是有没有什么方法可以创建动态区域并在运行时注入它们呢

更新:调用RegisterViewWithRegion实际上注入了我的文本块……但是在选项卡之间出现了一些奇怪的行为。


我更改了它,以便可以选择要注入的区域和文本。它总是适用于我创建的第一个区域,但在那之后,在选项卡之间翻转只会显示我添加到第一个区域的内容。选项卡控件是否在多个选项卡上重复使用my datatemplate?我已经包含了ViewModel中的所有代码。DynamicRegions只是一个可观察的集合

您需要调用region。至少对您添加到该区域的内容之一激活(StuffiGustAddedToTabsControl)。我将使选项卡控件和区域同步。否则,它看起来很疯狂,而且性能更差。

您需要调用region。至少对添加到region的一项内容激活(StuffigustAddedToTabsControl)。我将使选项卡控件和区域同步。否则它看起来很疯狂,表现得更糟。

好的,我有一些有效的方法,但我想看看安德森·艾姆斯想出了什么

基本上,当使用数据绑定生成tabItems时,我在代码中设置了所有区域内容

  private void AddDynamicRegion(object arg)
  {
     var newRegionName = "Region" + (DynamicRegions.Count + 1).ToString();
     DynamicRegions.Add(newRegionName);

     var tabItem = View.tabDemo.ItemContainerGenerator.ContainerFromIndex(DynamicRegions.Count - 1) as TabItem;
     var newRegionContainer = new ItemsControl();
     RegionManager.SetRegionName(newRegionContainer,newRegionName);
     RegionManager.SetRegionManager(newRegionContainer, _regionManager);
     tabItem.Content = newRegionContainer;


  }
然后在insert中,我可以这样做,所有的东西都显示在正确的区域下。我想知道是否有更好的方法

  private void AddRandomRegionContent(object arg)
  {

     if (string.IsNullOrEmpty(SelectedRegion) )
        return; 

     Debug.WriteLine("Injected "  + RegionContent + " into " + SelectedRegion);

     var newContent = new TextBlock() { Text = RegionContent };
     var region = _regionManager.Regions[SelectedRegion];
     if (region == null)
     {
        Debug.WriteLine("Couldn't find region");
        return;
     }

     region.Add(newContent);
     region.Activate(newContent);

  }

好的,我有一些有用的东西,但我想看看安德森·艾姆斯有什么想法

基本上,当使用数据绑定生成tabItems时,我在代码中设置了所有区域内容

  private void AddDynamicRegion(object arg)
  {
     var newRegionName = "Region" + (DynamicRegions.Count + 1).ToString();
     DynamicRegions.Add(newRegionName);

     var tabItem = View.tabDemo.ItemContainerGenerator.ContainerFromIndex(DynamicRegions.Count - 1) as TabItem;
     var newRegionContainer = new ItemsControl();
     RegionManager.SetRegionName(newRegionContainer,newRegionName);
     RegionManager.SetRegionManager(newRegionContainer, _regionManager);
     tabItem.Content = newRegionContainer;


  }
然后在insert中,我可以这样做,所有的东西都显示在正确的区域下。我想知道是否有更好的方法

  private void AddRandomRegionContent(object arg)
  {

     if (string.IsNullOrEmpty(SelectedRegion) )
        return; 

     Debug.WriteLine("Injected "  + RegionContent + " into " + SelectedRegion);

     var newContent = new TextBlock() { Text = RegionContent };
     var region = _regionManager.Regions[SelectedRegion];
     if (region == null)
     {
        Debug.WriteLine("Couldn't find region");
        return;
     }

     region.Add(newContent);
     region.Activate(newContent);

  }

让TabControl成为一个区域对您有效吗?这样,您就可以将区域添加到该视图中。如果这些视图需要一个区域,只需创建一个子/嵌套区域并将视图注入该区域即可。我真的从来没有需要动态创建区域

     <TabControl cal:RegionManager.RegionName="TabRegion" x:Name="tabDemo" ItemsSource="{Binding Something}" >
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
     </TabControl>


Prism中的StockChart显示了如何从视图模型中绑定选项卡的标题。它们使用TabPanel的一个子类(AnimatedTabPanel),但设置是相同的。

让TabControl成为一个区域是否适合您?这样,您就可以将区域添加到该视图中。如果这些视图需要一个区域,只需创建一个子/嵌套区域并将视图注入该区域即可。我真的从来没有需要动态创建区域

     <TabControl cal:RegionManager.RegionName="TabRegion" x:Name="tabDemo" ItemsSource="{Binding Something}" >
        <TabControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" />
            </DataTemplate>
        </TabControl.ItemTemplate>
     </TabControl>


Prism中的StockChart显示了如何从视图模型中绑定选项卡的标题。它们使用TabPanel(AnimatedTabPanel)的子类,但设置是相同的。

我得到一个例外,此RegionManager不包含名为“Region1”的区域。参数名称:RegionName当我在调试模式下查看RegionManager时,没有我期望的动态区域。据我所知,RegionManager是一个单例,因此设置区域名称附加属性应该会创建新的区域。哦。。。我知道你在做什么。这可能不会像你认为的那样起作用。。。然而,我可以拿出一个演示,你想要的。给我一点时间。我会继续摆弄,就像我说的,我真的没想到它会起作用,但我觉得值得一试。我得到一个例外,这个RegionManager不包含名为“Region1”的区域。参数名称:RegionName当我在调试模式下查看RegionManager时,没有我期望的动态区域。据我所知,RegionManager是一个单例,因此设置区域名称附加属性应该会创建新的区域。哦。。。我知道你在做什么。这可能不会像你认为的那样起作用。。。然而,我可以拿出一个演示,你想要的。给我一点时间。我会继续摆弄,就像我说的,我真的没想到它会起作用,但我觉得值得一试。是的。。。你一定要激活它。。。否则,它将无法在任何类型的选择器控件下正确显示。这很接近我要提出的建议是的。。。你一定要激活它。。。否则,它将无法在任何类型的选择器控件下正确显示。这与我将要提出的非常接近。在我们的例子中,我们有离散的观点,我们需要动态聚合。我们将从数据库中获取聚合的结构。因此,选项卡控件将绑定到选项卡列表,然后对于每个选项卡,我们将拥有在此场景中插入哪些视图的元数据。我了解你的来历,但我认为,有一些缓和的环境确实使动态区域成为更具吸引力的选择。我认为你的问题过于复杂了。我的设置与您在我的SL应用程序中描述的类似。通过WCF读取设置以查找“已安装的插件”。每个已安装的插件在选项卡控件中都有自己的选项卡。对于每个“已安装的插件”,我创建一个ViewModel并将其视图添加到属于TabControl的区域。选项卡控件将其头绑定到我刚才添加的VM。我添加的每个视图都有自己的嵌套区域。在运行时创建区域的唯一原因应该是子/嵌套区域。在我们的例子中,我们需要动态聚合离散视图。我们将从