首页 文章

WPF TabControl:ItemContainerStyle和ItemTemplateSelector

提问于
浏览
1

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

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

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

So my question is: How can I define the style of the TabItems, when I use an ItemTemplateSelector?

这是一些代码:

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

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

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

    Solution:

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

    谢谢!

相关问题