我很长时间对此感到困惑,这些似乎都影响了这些标签。 tabcontrol中的演示文稿。 它是否设计用于最佳控制tabcontrol的表示? 或者如果有什么我不理解的。
答案 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.ItemTemplate
为TabItems
的{{1}}集合中的所有Items
指定一个模板,除非您覆盖特定TabControl
TabItem.ContentTemplate
1}} 击>
所以,虽然他们也这样做,TabItem
是TabControl.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通知我们TabControl
和ItemTemplate
属性会被ItemTemplateSelector
容器类型的项目忽略,在本例中为ItemsControl's
。在这种情况下,我们需要指定TabItem
来更改标题的外观。
所以TabItem.HeaderTemplate
和TabControl.ItemTemplate
不会这样做,但我之前的解释仍适用于TabItem.ContentTemplate
和TabControl.ContentTemplate
。