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

How to add TabControl content as button dynamically?

我正在做一个项目,我想在 WPF 中的 TabControl 的内容 属性 中添加按钮。

我试了很多方法都失败了。

这是代码示例:

  1. XAML 文件
  2. c# 文件

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. 通过在 <TabControl.ContentTemplate><DataTemplate> 中添加堆栈面板、网格、按钮。
  2. 通过添加动态网格并在该网格中添加动态按钮。
  3. 还有很多我无法解释的其他方式。

A 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);

一个TabControl,就像所有的WPF控件都是一个容器。它可以容纳多个对象,但所有这些对象实际上都是 TabItem 个对象。 TabItem控件只能容纳一个对象,所以如果你想让它包含的不仅仅是Button,你必须先给TabItem添加一个不同的容器;像 GridStackPanel.

你必须在 XAML 中替换而不是 <TabControl.ContentTemplate> 将其替换为 <TabControl.DataContext>,这就是我花了几个小时才发现这个小错误的解决方案。

<TabControl.DataContext>
     <DataTemplate>

     </DataTemplate>
</TabControl.DataContext>

以上是XAML部分的改动