如何从 TabItem 的 HeaderTemplate 触发 'IsSelected'?
How can I trigger on 'IsSelected' from a TabItem's HeaderTemplate?
我为我的 WPF 应用程序创建了自定义样式 TabControl
。这包括 TabItem
的以下 Style
:
<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>
基本上,我希望 header 文本大小为 14 并且颜色为白色,除非选择了 TabItem
(那么它应该是 o运行ge):
当我看到 TabItem
的 child 控件(上面的屏幕中没有显示)继承了 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
o运行ge 着色。我的直觉是 DataTrigger 找不到 TemplatedParent
或 TextBlock
,但我卡住了。
我有哪些选择可以实现我的目标?
好的,问题 #1
绑定模式不正确,不要使用Mode=TemplatedParent
,使用
{ Binding Path=propertyOfTargetElement,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type typeOfTargetElement}
}
}
**
**
至于 #2 问题,我会将触发器移到文本块中。请注意,我在该数据模板中看不到 contentpresenter 的用途,因此将其删除,除非它存在是有原因的)。
然后我会
<TextBlock>
<TextBlock.Style>
<Style.Triggers>
<DataTrigger
我为我的 WPF 应用程序创建了自定义样式 TabControl
。这包括 TabItem
的以下 Style
:
<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>
基本上,我希望 header 文本大小为 14 并且颜色为白色,除非选择了 TabItem
(那么它应该是 o运行ge):
当我看到 TabItem
的 child 控件(上面的屏幕中没有显示)继承了 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
o运行ge 着色。我的直觉是 DataTrigger 找不到 TemplatedParent
或 TextBlock
,但我卡住了。
我有哪些选择可以实现我的目标?
好的,问题 #1
绑定模式不正确,不要使用Mode=TemplatedParent
,使用
{ Binding Path=propertyOfTargetElement,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type typeOfTargetElement}
}
}
**
**
至于 #2 问题,我会将触发器移到文本块中。请注意,我在该数据模板中看不到 contentpresenter 的用途,因此将其删除,除非它存在是有原因的)。
然后我会
<TextBlock>
<TextBlock.Style>
<Style.Triggers>
<DataTrigger