如何动态添加 TabControl 内容作为按钮?
How to add TabControl content as button dynamically?
我正在做一个项目,我想在 WPF 中的 TabControl 的内容 属性 中添加按钮。
我试了很多方法都失败了。
这是代码示例:
- XAML 文件
- 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);
}
};
我尝试了以下选项:
- 通过在
<TabControl.ContentTemplate>
的 <DataTemplate>
中添加堆栈面板、网格、按钮。
- 通过添加动态网格并在该网格中添加动态按钮。
- 还有很多我无法解释的其他方式。
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
添加一个不同的容器;像 Grid
或 StackPanel
.
你必须在 XAML
中替换而不是 <TabControl.ContentTemplate>
将其替换为 <TabControl.DataContext>
,这就是我花了几个小时才发现这个小错误的解决方案。
<TabControl.DataContext>
<DataTemplate>
</DataTemplate>
</TabControl.DataContext>
以上是XAML部分的改动
我正在做一个项目,我想在 WPF 中的 TabControl 的内容 属性 中添加按钮。
我试了很多方法都失败了。
这是代码示例:
- XAML 文件
- 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);
}
};
我尝试了以下选项:
- 通过在
<TabControl.ContentTemplate>
的<DataTemplate>
中添加堆栈面板、网格、按钮。 - 通过添加动态网格并在该网格中添加动态按钮。
- 还有很多我无法解释的其他方式。
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
添加一个不同的容器;像 Grid
或 StackPanel
.
你必须在 XAML
中替换而不是 <TabControl.ContentTemplate>
将其替换为 <TabControl.DataContext>
,这就是我花了几个小时才发现这个小错误的解决方案。
<TabControl.DataContext>
<DataTemplate>
</DataTemplate>
</TabControl.DataContext>
以上是XAML部分的改动