WPF TabControl:ItemContainerStyle 和 ItemTemplateSelector

WPF TabControl: ItemContainerStyle and ItemTemplateSelector

我无法在某处找到问题的答案。也许你们可以帮助我。

我正在使用 WPF 并且有一个使用 ItemTemplateSelector 的 TabControl。 TabControl 的 ItemsSource 是字符串的 ObservableCollection。根据字符串,选择 TabItem 的模板。到目前为止工作正常。

我现在唯一的问题是我想在我的 TabItems 上使用自定义样式。所以我尝试了 ItemContainerStyle 属性,但这不起作用。当我设置 ItemContainerStyle 时,ItemTemplateSelector 不再触发。我没有使用 ContentTemplateSelector,因为我不需要在此解决方案中使用它,因为选项卡的内容始终相同。

所以我的问题是:当我使用 ItemTemplateSelector 时,如何定义 TabItems 的样式?

这是一些代码:

用户控件上的 TabControl:

<TabControl TabStripPlacement="Right"
            ItemsSource="{Binding loadedPalettes, UpdateSourceTrigger=PropertyChanged}"
            Style="{StaticResource StyleTabControl}"
            ItemTemplateSelector="{StaticResource TabTemplateSelector}"
            Height="Auto"
            SelectionChanged="paletteSelectionChanged"
            SelectedIndex="{Binding selPaletteIndex}"
            Width="Auto"
            Margin="0,5,0,0">

    <TabControl.ContentTemplate>
        <DataTemplate>
            <local:tabDataGrid />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

模板选择器Class

Public Class SSITabTemplateSelector
    Inherits DataTemplateSelector

    Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
        Dim element As FrameworkElement
        element = TryCast(container, FrameworkElement)

        If element Is Nothing Then Return Nothing
        If container Is Nothing Then Return Nothing

        Select Case item
            Case "Search"
                Return TryCast(element.FindResource("searchTabItem"), DataTemplate)
                'Case "TabSwitch"
                '    Return TryCast(element.FindResource("TextItem"), DataTemplate)
            Case Else
                Return TryCast(element.FindResource("normalTabItem"), DataTemplate)
        End Select

        Return Nothing
    End Function
End Class

TabItems 的数据模板

<DataTemplate x:Key="normalTabItem">
    <StackPanel Name="Panel"
                Orientation="Horizontal">
        <TextBlock Text="{Binding}"
                   Background="Transparent">
            <TextBlock.LayoutTransform>
                <RotateTransform Angle="270" />
            </TextBlock.LayoutTransform>
        </TextBlock>

        <ContentPresenter x:Name="ContentSite"
                          VerticalAlignment="Center"
                          HorizontalAlignment="Center"
                          Content="{Binding Content}" />
    </StackPanel>
</DataTemplate>

<DataTemplate x:Key="searchTabItem">
    <StackPanel Name="Panel"
                Orientation="Horizontal">
        <TextBlock Text="blabla"
                   Background="AliceBlue">
            <TextBlock.LayoutTransform>
                <RotateTransform Angle="270" />
            </TextBlock.LayoutTransform>
        </TextBlock>

        <ContentPresenter x:Name="ContentSite"
                          VerticalAlignment="Center"
                          HorizontalAlignment="Center"
                          Content="{Binding Content}" />
    </StackPanel>
</DataTemplate>

解法:

是的,就是这么简单。 bars222 的答案是正确的。只需使用 <TabControl.Resources> 并添加样式。

谢谢!

根据评论添加答案。你可以这样写。

<TabControl>
    <TabControl.Resources>
        <Style TargetType="TabItem">
            <Setter Property="Header" Value="MyHeader"/>
        </Style>
    </TabControl.Resources>
</TabControl>