WPF TabControl:ItemContainerStyle和ItemTemplateSelector

时间:2016-03-02 06:59:33

标签: wpf vb.net xaml tabcontrol

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

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

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

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

以下是一些代码:

Usercontrol上的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>

TemplateSelector类    

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的DataTemplates

<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>

2 个答案:

答案 0 :(得分:0)

<强>解决方案:

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

谢谢!

答案 1 :(得分:0)

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

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