24

如何将 TabItem.Header 设置为从几个字段中获取的绑定,每个绑定以不同的大小显示,所有这些都位于原始标题文本的位置;不覆盖标题的默认样式和行为 - 我只需要文本。

我尝试设置它的模板,但随后它创建了一个包含内部控件的矩形,并且该矩形对用户单击没有响应,并且还具有控件样式,我希望此控件不可见,只有其文本可见.

我尝试了以下方法:

<TabControl ItemsSource="{Binding}">
    <TabControl.ItemTemplate>
         <DataTemplate>
             <TabItem>
                 <TabItem.Header>
                     <MultiBinding StringFormat="{}{0}-{1}">
                         <Binding Path="Title"/>
                         <Binding Path="Category.Title"/>
                     </MultiBinding>
                 </TabItem.Header>
                 <TabItem.Content>
                     <TextBlock>
                         Here is what is gonna be in the TabItem - not header
                     </TextBlock>
                 </TabItem.Content>
             </TabItem>
         </DataTemplate>
    </TabControl.ItemTemplate>
</TabControl>

但它没有显示任何东西。

我也尝试将 HeaderTemplate 设置为 DataTemplate 但发生的情况是,DataTemplate 覆盖了 TabItem 样式,当我单击文本时它不会转到单击的选项卡,此外,未选择的选项卡看起来很有趣,我明白了文本的矩形浮动,而我希望它是透明的。

所以,总结一下我的问题,我想用 StringFormat 将 TabItem.Header.Text 设置为 MultiBinding。

4

1 回答 1

68

TabControl 包含一个 ContentTemplate 属性以及它从 ItemsControl 继承的 ItemTemplate。它使用 ContentTemplate 来区分内容区域中显示的内容,而 ItemTemplate 定义了 Header 的模板。此外,您的 ItemSource 中的每个 Item 都将自动包装在 TabItem 中;它不需要在 ItemTemplate 中重新创建,因为这会尝试将 TabItem 放置在您注意到的 Header 中。

不要在 ItemTemplate 中重新创建 TabItem,而是使用 ItemTemplate 来定义您的 Header 内容,并使用 ContentTemplate 来定义您的 Content。

<TabControl ItemsSource="{Binding}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{}{0}--{1}">
                        <Binding Path="Title" />
                        <Binding Path="Category.Title" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding MyContent}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

在您的第一段中,您提到要在页眉的绑定部分设置不同的大小。如果您确实想这样做,您将无法像上面那样使用单个 Binding 或 MultiBinding 来设置 Text。相反,您可以嵌套 TextBlock 以使用不同的格式来实现此目的。

<TabControl.ItemTemplate>
    <DataTemplate>
        <TextBlock>
            <TextBlock Text="{Binding Title}"
                       FontSize="12" />
            <Run Text="--" />
            <TextBlock Text="{Binding Category.Title}"
                       FontSize="10" />
        </TextBlock>
    </DataTemplate>
</TabControl.ItemTemplate>
于 2009-12-08T23:38:29.587 回答