Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:TabControl.ItemTemplate和TabItem.ContentTemplate之间的差异_C#_Wpf - Fatal编程技术网

C# WPF:TabControl.ItemTemplate和TabItem.ContentTemplate之间的差异

C# WPF:TabControl.ItemTemplate和TabItem.ContentTemplate之间的差异,c#,wpf,C#,Wpf,我对此困惑了很长时间,这两个选项似乎都会影响tabitems在tabcontrol中的显示。 它是为最好地控制tabcontrol的表示而设计的吗? 或者如果有什么我不明白的地方。 设置TabControl.ItemTemplate可以为TabControl的Items集合中的所有TabItems指定一个模板,除非为特定的TabItem覆盖TabItem.ContentTemplate 因此,尽管它们的作用相同,TabControl.ItemTemplate是TabControl和TabItem

我对此困惑了很长时间,这两个选项似乎都会影响tabitems在tabcontrol中的显示。 它是为最好地控制tabcontrol的表示而设计的吗? 或者如果有什么我不明白的地方。

设置
TabControl.ItemTemplate
可以为
TabControl
Items
集合中的所有
TabItems
指定一个模板,除非为特定的
TabItem
覆盖
TabItem.ContentTemplate

因此,尽管它们的作用相同,
TabControl.ItemTemplate
TabControl
TabItem中所有
TabItems
的更通用的模板。ContentTemplate
特定于它在中使用的
TabItem

上述情况并不完全正确,因为
TabControl
有一个
ItemTemplate
属性和一个
ContentTemplate
属性,这使它更容易混淆

ItemTemplate
用作通过
ItemsSource
上的数据绑定或通过Xaml添加的所有
TabItems
的标题(选项卡内容)的模板,而不使添加的项目成为
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
,标题文本为黑色,内容仍然为蓝色。还有一个数据错误,通知我们对于已经是
ItemsControl的
容器类型的项,忽略了
ItemTemplate
ItemTemplateSelector
属性,在本例中为
TabItem
。在这种情况下,我们需要指定
TabItem.HeaderTemplate
来更改标题的外观


所以
TabControl.ItemTemplate
TabItem.ContentTemplate
不做同样的事情,但是我前面的解释仍然适用于
TabControl.ContentTemplate
TabItem.ContentTemplate
属性
ItemsControl.ItemTemplate
用于定义数据绑定集合中的每个项的外观。。。从MSDN上的页面:

获取或设置用于显示每个项的数据模板

如您所见,它的类型为
DataTemplate
,通常用于显示数据的模板。。。其
DataContext
将自动设置为集合中的项目,因此在该
DataTemplate
中声明的控件将自动访问项目属性。请参阅MSDN上的页面以获取更多帮助

类似地,从MSDN中可以看出:

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

同样,其
DataContext
将自动设置为设置为
Content
属性的对象。请注意,
ContentControl
只有一个
ContentTemplate
属性,没有用于集合项目的
itemtplate
属性。。。从MSDN上的数据模板概述页面:

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


更新>>>

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

使用
ContentTemplate
属性定义设置为
ContentControl
属性的对象的外观

使用
ItemTemplate
属性定义集合控件项的外观

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

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

多个对象:

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

单个对象:

<ContentControl Content="{Binding Person}" 
    ContentTemplate="{StaticResource Template}" ... />

对于一个非常简单的问题,这里有一些很长的答案。为避免混淆:


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

我相信这也有同样的作用。谢谢,你的解释很有用。事实上,我不太正确。刚刚检查并发现
TabControl
有一个
ItemTemplate
属性和一个
ContentTemplate
属性。我会马上更新我的答案以反映这一点。所以结论是:TabControl(或列表框)是itemsControl,这意味着它的属性(如itemTemplate)只负责其自身的item表单和itemssource。并且它不会以其他方式对添加的对象起作用。对吗?非常棒的解释。非常感谢,Sheridan。
<ContentControl Content="{Binding Person}" 
    ContentTemplate="{StaticResource Template}" ... />