WPF:TabControl.ItemTemplate和TabItem.ContentTemplate之间的区别

时间:2014-08-12 13:14:45

标签: c# wpf

我很长时间对此感到困惑,这些似乎都影响了这些标签。 tabcontrol中的演示文稿。 它是否设计用于最佳控制tabcontrol的表示? 或者如果有什么我不理解的。

3 个答案:

答案 0 :(得分:25)

这里有一些非常长的答案,实际上这是一个非常简单的问题。为避免混淆:

ItemTemplate是用于格式化ItemsSource中每个项目以创建标题(显示在标签栏中的控件)的模板,ContentTemplate是用于格式化每个项目的模板ItemsSource中的项目,用于创建标签的内容(单击标题时显示的控件)。

答案 1 :(得分:5)

ItemsControl.ItemTemplate属性用于定义数据绑定集合中的每个项目应该是什么......来自MSDN上的ItemsControl.ItemTemplate Property页面:

  

获取或设置用于显示每个项目的DataTemplate。

正如您所看到的,它的类型为DataTemplate,这是显示数据的模板的惯例......其DataContext将自动设置为集合中的项目,因此声明了控件因为DataTemplate将自动访问items属性。有关此问题的详细信息,请参阅MSDN上的Data Templating Overview页面。

同样,从MSDN,ContentControl.ContentTemplate Property

  

获取或设置用于显示ContentControl内容的数据模板。

同样,它的DataContext将自动设置为设置为Content属性的对象。请注意,ContentControl只有ContentTemplate属性,没有ItemTemplate属性,用于收集项目......来自MSDN上的数据模板概述页面:

  

因为myTaskTemplate是一种资源,所以现在可以在具有采用DataTemplate类型的属性的其他控件上使用它。如上所示,对于ItemsControl对象,例如ListBox,它是ItemTemplate属性。对于ContentControl对象,它是ContentTemplate属性。


更新>>>

为了进一步澄清这种情况,请考虑这个简单的规则:

  

使用ContentTemplate属性来定义设置为Content的{​​{1}}属性的对象应该如何显示。

     

使用ContentControl属性定义集合控件的的外观。

最简单的区别。但是,我想指出,由于这些属性都属于ItemTemplate类型,因此它们的值 可以互换。

例如,假设您有一个DataTemplate类,并在Person中显示Person个对象的集合。您可以声明ListBox设置为DataTemplate属性,以定义集合中每个ListBox.ItemTemplate的外观。但是,如果您只想显示一个Person,则可以使用Person ContentControl设置为Content类的实例,并仍使用相同 Person,但设置为DataTemplate而不是:

多个对象:

ContentTemplate

...

单个对象:

<ListBox ItemsSource="{Binding People}" ItemTemplate="{StaticResource Template}" ... />

答案 2 :(得分:3)

<击> 设置TabControl.ItemTemplateTabItems的{​​{1}}集合中的所有Items指定一个模板,除非您覆盖特定TabControl TabItem.ContentTemplate 1}}

<击>

所以,虽然他们也这样做,TabItemTabControl.ItemTemplate TabItems中所有TabControl的更通用的模板,TabItem.ContentTemplate是特定于它使用的TabItem

以上情况并非如此,因为TabControl具有ItemTemplate属性和ContentTemplate属性,以使其更加混乱。

ItemTemplate用作通过TabItems上的数据绑定或通过Xaml添加的所有ItemsSource的标题(标签内容)的模板,而不会使添加的项目成为{{1 }}:

TabItem

这将在标题/标签中创建一个带有红色文字的<TabControl ItemsSource="{Binding ListOfItems}"> <TabControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" Foreground="Red"/> </DataTemplate> </TabControl.ItemTemplate> <TabControl.ContentTemplate> <DataTemplate> <TextBlock Text="{Binding}" Foreground="Blue"/> </DataTemplate> </TabControl.ContentTemplate> </TabControl> ,为内容创建蓝色文字。

现在,如果我们执行以下操作:

TabControl

我们将有一个<TabControl> <TabControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" Foreground="Red"/> </DataTemplate> </TabControl.ItemTemplate> <TabControl.ContentTemplate> <DataTemplate> <TextBlock Text="{Binding}" Foreground="Blue"/> </DataTemplate> </TabControl.ContentTemplate> <TabItem Header="One" Content="One"/> <TabItem Header="Two" Content="Two"/> <TabItem Header="Three" Content="Three"/> </TabControl> ,其中包含三个标签,标题文字为黑色,内容仍为蓝色。还有一个DataError通知我们TabControlItemTemplate属性会被ItemTemplateSelector容器类型的项目忽略,在本例中为ItemsControl's。在这种情况下,我们需要指定TabItem来更改标题的外观。

所以TabItem.HeaderTemplateTabControl.ItemTemplate不会这样做,但我之前的解释仍适用于TabItem.ContentTemplateTabControl.ContentTemplate