WPF TabItem HeaderTemplate

示例代码:

         

如您所见,TabItem标题始终是具有不同内容的堆栈面板:

     

你怎么能把它放在一个模板中,这样我就没有重复的stackpanel代码?

试着这样做:

                       

结果是:

  • “财产’标题’不止一次。”
  • “对象’对象’已经有了一个孩子,无法添加’TextBlock’。’对象’只能接受一个孩子。”

树标题唯一常见的是Margin =“5”。 在第二个和第三个选项卡中,stackpanel是无关紧要的,因为它只有一个子节点。 您可以使用HeaderTemplate或ItemContainerStyle来实现它:

                         

现在你不重复任何事情。

您还可以将stackpanel的属性提取为样式以避免重复它们:

                  

如果您想要更多的代码重用,您应该考虑类似MVVM的方法:

      

如果您不能对所有标头使用单个DataTemplate,则可以使用HeaderTemplateSelector

我认为只有在绑定Tab集合并动态生成它们时才会使用HeaderTemplate。 如果在ViewModel中设置对象,这将起作用(Header属性是具有隐式DataTemplates的项的集合,可以根据其类型生成TextBlocks或Rectangles)。

否则,您需要为StackPanel通用样式以使它们完全相同并保存重复,或者将TabItem.Header内容的第一个元素设置为派生自StackPanel的自定义控件。

我会自己选择Style路线,除非真的迫切需要从XAML中删除StackPanel线。