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>
我无法在某处找到问题的答案。也许你们可以帮助我。
我正在使用 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>