繁体   English   中英

WPF TabControl:ItemContainerStyle和ItemTemplateSelector

[英]WPF TabControl: ItemContainerStyle and ItemTemplateSelector

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

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

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

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

这是一些代码:

用户控件上的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的数据模板

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM