如何动态地将TabControl内容添加为按钮?

时间:2016-08-19 14:26:37

标签: c# wpf xaml tabcontrol

我正在开发一个项目,我希望在WPF中的TabControl的内容属性中添加按钮。

我尝试了很多方法,但我失败了。

这是代码示例:

  1. XAML文件
  2. c#文件
  3. 1。 XAML文件

    <TabControl TabStripPlacement="Left" Name="DynamicTab">
        <TabControl.ItemTemplate>
            <DataTemplate>
    
            </DataTemplate>
        </TabControl.ItemTemplate>
        <TabControl.ContentTemplate>
            <DataTemplate>
    
            </DataTemplate>
        </TabControl.ContentTemplate>
    

    2。 C#文件

    foreach(DataContextClass glist in groupsList)
    {
        TabItem tab = new TabItem();
        StackPanel sp = new StackPanel();
    
        tab.Header = glist.ItemGroup;
        DynamicTab.Items.Add(tab);
        itemsList = itemsDALObj.ItemsGroupWise(glist.ItemGroup);
        for(int i =0 ; i<itemsList.Count;i++)
        {
            Button b = new Button();
            b.Name = "Button" + (i + 1);
            b.Content = itemsList[i].ItemName;
            b.Height = 80;
            b.Width = 100;
            tab.Content = sp;
            sp.Children.Add(b);
         }
    };
    

    我尝试了以下选项:

    1. <DataTemplate> {/ 1}}的{​​{1}}中添加了stackpanel,Grid,Button
    2. 通过添加动态网格,在该网格中添加动态按钮。
    3. 我也无法解释许多其他方式。

2 个答案:

答案 0 :(得分:0)

TabControl的设计理念是,添加到其中的唯一控件是TabItem控件。 实际上,您可以直接将其他控件添加到父TabControl对象,但是当您这样做时,它会自动创建一个隐式TabItem来保存这些对象。

例如,如果您直接向Button添加两个TabControl控件,则会创建两个隐式TabItem控件,一个用于保存每个Button

<TabControl>
  <Button/>
  <Button/>
</TabControl>

这样可行,但这是非常错误的方法。

要正确向TabControl添加内容,请先创建TabItem。将其他控件添加到TabItem,然后将TabItem添加到TabControl。 (如果您愿意,可以先将TabItem添加到TabControl,但这并不重要。

在XAML中:

<TabControl>
  <TabItem Header="This is the label for the tab item.">
    <Button Content="My Button"/>
  </TabItem>
</TabControl>

在代码中(假设预先存在的TabControl):

        TabItem ti = new TabItem();
        ti.Header = "Tab Header Text";
        Button bt = new Button();
        bt.Content = "Button Text";
        ti.Content = bt;
        myTabControl.Items.Add(ti);

与所有WPF控件一样,TabControl是一个容器。它可以容纳多个对象,但所有这些对象实际上都是TabItem个对象。 TabItem控件只能容纳一个对象,因此如果您希望它包含的不仅仅是Button,则必须先向TabItem添加一个不同的容器;比如GridStackPanel

答案 1 :(得分:0)

您必须替换为XAML而不是<TabControl.ContentTemplate>将其替换为<TabControl.DataContext>,这就是解决这个小错误所需的解决方案。

<TabControl.DataContext>
     <DataTemplate>

     </DataTemplate>
</TabControl.DataContext>

以上是XAML部分的变化。