wpf - 在 TabControl.ContentTemplate 中,如何添加新用户控件?

  显示原文与译文双语对照的内容
149 0

我在 TabControl.ContentTemplate 中添加了一个小usercontrol的新实例?

我的XAML在这里:

<TabControl ItemsSource="{Binding Tables}">
 <TabControl.ItemTemplate>
 <DataTemplate>
 </DataTemplate>
 </TabControl.ItemTemplate>
 <TabControl.ContentTemplate>
 <DataTemplate DataType="{x:Type uc:mytest1}">
 <uc:mytest1>
 </uc:mytest1>
 </DataTemplate>
 </TabControl.ContentTemplate>
</TabControl>

在一个用户控件中,我希望添加新的项目,但在这里应用程序中,我希望添加新的项目,但我希望添加新的用户控件,但我希望每个新的用户控件都添加新的控件。

我对WPF非常陌生,可能是我做了一个非常基本的错误,请指导我。

时间:原作者:0个回答

93 3

ControlTemplate 确定选项卡控件的元素的外观,这些元素不是单个选项卡项的一部分。ItemTemplate 处理单个选项卡项的内容。另外,TabItem 是一个headered内容控件,这意味着它有两个内容类型属性 ContentHeader,带有两个单独的模板 ContentTemplateHeaderTemplate为了能够使用绑定填充选项卡项,你需要使用上面的属性来样式化 TabItem

例如:

<Window x:Class="Example.Window2"
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 Name="Window"
 Title="Window2" Height="300" Width="300">
 <Window.DataContext>
 <Binding ElementName="Window" Path="VM"/>
 </Window.DataContext>
 <Window.Resources>
 <DataTemplate x:Key="TabItemHeaderTemplate">
 <Grid>
 <TextBlock Text="{Binding Header}"/>
 <Ellipse Fill="Red" Width="40" Height="40" Margin="0,20,0,0"/>
 </Grid>
 </DataTemplate>
 <DataTemplate x:Key="TabItemContentTemplate">
 <Ellipse Fill="Green"/>
 </DataTemplate>
 <Style x:Key="TabItemContainerStyle" TargetType="TabItem">
 <Setter Property="Header" Value="{Binding}"/>
 <Setter Property="HeaderTemplate" 
 Value="{StaticResource TabItemHeaderTemplate}"/>
 <Setter Property="Content" Value="{Binding}"/>
 <Setter Property="ContentTemplate" 
 Value="{StaticResource TabItemContentTemplate}"/>
 </Style>
 </Window.Resources>
 <Grid>
 <TabControl ItemsSource="{Binding Items}" 
 ItemContainerStyle="{StaticResource TabItemContainerStyle}"/>
 </Grid>
</Window>

后面的代码:

public partial class Window2 : Window
{
 public TabControlVM VM { get; set; }
 public Window2()
 {
 VM = new TabControlVM();
 InitializeComponent();
 }
}

和视图模型类:

public class TabControlVM
{
 public ObservableCollection<TabItemVM> Items { get; set; }
 public TabControlVM()
 {
 Items = new ObservableCollection<TabItemVM>();
 Items.Add(new TabItemVM("tabitem1"));
 Items.Add(new TabItemVM("tabitem2"));
 Items.Add(new TabItemVM("tabitem3"));
 Items.Add(new TabItemVM("tabitem4"));
 }
}
public class TabItemVM
{
 public string Header { get; set; }
 public TabItemVM(string header)
 {
 Header = header;
 }
}
原作者:
51 4

在设置模板时,通常使用 DataTemplate 。ControlTemplate等,这些模板中的可视元素在WPF中使用UI虚拟化的概念进行重用。tlb一次只显示一个项目,因这里它不会为每个选项卡项创建新的视觉项目。它的加载/卸载事件被激发,但对象总是相同的。

你可以以使用加载/卸载事件,并相应地编写你的"可视元素"代码,这样控件应该是无状态的。当新的DataContext应用时,应刷新所有内容。

DataContextChanged 。加载和卸载的事件可以帮助你删除旧数据的所有依赖项。

否则,使用UserControl手动创建新的TabItem,并将它的添加到TabControl中,而不是添加数据项。

手动添加TabItems将为每个项目创建新的控件,并且在选定区域中,根据选择将显示不同的元素。

原作者:
...