Я создал пользовательский стиль TabControl
для моего приложения WPF. Это включает в себя следующее Style
для TabItem
с:Как я могу активировать функцию 'IsSelected' из HeaderTemplate TabItem?
<Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}">
<Setter Property="Padding" Value="12,2"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="Foreground" Value="White" />
<Setter Property="FontSize" Value="14" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}"/>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="1" />
<Setter Property="Foreground" Value="Orange" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
В принципе, я хочу, текст заголовка, чтобы быть размером 14 и окрашены в белый цвет, кроме случаев, когда выбран TabItem
(тогда он должен быть оранжевый):
У меня возникла проблема, когда я увидел, что дочернее управление TabItem
(которое не отображается на экране выше) унаследовало FontSize
и Foreground
. После быстрого поиска в SO я пришел к этой теме (SO: How do I set TabControls TabItem header FontSize) и решил использовать HeaderTemplate, как рекомендовал ответчик «Novitchi S». Это мой результат:
<Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}">
<Setter Property="Padding" Value="12,2"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate DataType="{x:Type TabItem}">
<ContentPresenter>
<ContentPresenter.Content>
<TextBlock x:Name="ContentTextBlock" Foreground="White" FontSize="14" Text="{TemplateBinding Content}"/>
</ContentPresenter.Content>
</ContentPresenter>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=IsSelected}">
<Setter TargetName="ContentTextBlock" Property="Foreground" Value="Orange" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" HorizontalAlignment="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{Binding VerticalContentAlignment, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ItemsControl}}}"/>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="1" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
С положительной стороны, FontSize
и Foreground
теперь работает нормально. Единственное, что я не могу заставить работать, - это окрасить оранжевый цвет TextBlock
, когда выбрана вкладка. Моя интуиция заключается в том, что DataTrigger либо не может найти TemplatedParent
, либо TextBlock
, но я застрял.
Какие варианты я должен выполнить для своей цели?
Зачем использовать режим = TemplatedParent, в DataTemplate, не должны вы делать {Binding Path = propertyOfTargetElement, RelativeSource = {RelativeSource Mode = FindAncestor, AncestorType = {х: Тип typeOfTargetElement}}} – TYY
@TYY Меня всегда путают со всеми типами привязок, поэтому я не придумал этого. Спасибо, что состояние 'Trigger' отлично работает. Однако цвет 'TextBlock' по-прежнему не изменится. Я сделал еще одну ошибку, или это «TextBlock» только из названия? – Physikbuddha
@TYY Глупый мне, я забыл добавить 'Value =" True "' к моему 'DataTrigger'. Теперь работает безупречно! – Physikbuddha