我正在尝试使用触发器更改WPF标签项的标题文本块的前景文本颜色。这适用于大多数(更简单)的场景,但不适用于TextBlocks的全局样式。
所以这个简单的“鼠标悬停”触发器可以改变前景色:
<Style x:Key="testTabItemStyle1" TargetType="{x:Type TabItem}">
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Background" Value="White"/>
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
<Setter Property="VerticalContentAlignment" Value="Stretch"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid SnapsToDevicePixels="true">
<Border x:Name="Bd" Background="White" BorderBrush="Gray" BorderThickness="1,1,1,0">
<ContentPresenter HorizontalAlignment="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" x:Name="Content" VerticalAlignment="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" ContentSource="Header"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="Bd" Value="Black"/>
<Setter Property="Foreground" Value="False"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
问题是当TextBlocks在App.xaml中进行全局样式设置时(为了保持一致的外观),前景不会改变,但会保留全局样式的前景色。这就是我的TextBlocks的样式:
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="Foreground" Value="Brown"/>
<Setter Property="Margin" Value="4,0,4,0"/>
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
<Setter Property="TextWrapping" Value="NoWrap"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
所以我的问题是,明确定义的样式赋值(在TabItem的触发器中)不应该优先吗?更重要的是,如何在不单独为所有文本块分配样式但使TabItem文本块按预期更改颜色的情况下解决此问题?
非常感谢
NT
答案 0 :(得分:2)
此链接可能对您有所帮助。 Changing the Foreground colour of a contentpresenter in a listbox 它解释了如何更改contentpresenter的前景色。
答案 1 :(得分:1)
适合我。只需要改变这个:
<Setter Property="Foreground" Value="False"/>
到此:
<Setter Property="Foreground" Value="White"/>
答案 2 :(得分:0)
您正在将TabItem的前景色设置为红色,而不是TextBlock。 也许TextBox样式不是从TabItem继承的,因为用户集隐式样式优先于触发器设置器。
尝试将绑定添加到TextBlock的父TabItem Foreground属性。
修改
喜欢这个
Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, AncestorLevel=1}, Path=Foreground}"
答案 3 :(得分:0)
我的意思是:
<TabItem Header="Summary" x:Name="TabSummary" IsSelected="True" Style="{DynamicResource testTabItemStyle1}">
<Border x:Name="TabSummaryBody" Margin="-5,-5,-5,-5">
<StackPanel Margin="0,30,0,0" HorizontalAlignment="Center">
<TextBlock Text="Please select a document using the tree view on your right to show its properties."
FontSize="16"
Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, AncestorLevel=1}, Path=Foreground}"/>
</StackPanel>
</Border>
</TabItem>
Binding找到父TabItem并绑定到其Foreground属性。
答案 4 :(得分:0)
非常感谢你的帮助,你成功地引导我走向了正确的方向。
我的目的是改变TabItem的文本(由WPF的ContentPresenter创建),而不是在XAML中声明的选项卡中的TextBlock,并且可以轻松地改变颜色。
问题在于全球风格优先。由于TextBlock是由WPF创建的而不是由我声明的,所以我无法访问它。
解决方案是指定ContentPresenter资源,如下:
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid SnapsToDevicePixels="true">
<Border x:Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,1,1,0" Padding="{TemplateBinding Padding}">
<ContentPresenter HorizontalAlignment="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" x:Name="Content" VerticalAlignment="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" ContentSource="Header" RecognizesAccessKey="True">
<ContentPresenter.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type TabItem}}}"/>
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
</Border>
</Grid>
如您所见,我在ContentPresenter资源中设置了TextBlock样式。 所以显然现在ContentPresenter中的任何TextBlock都应该使用父的Foreground属性,这将由于值强制而优先,解决了我的问题。
非常感谢所有人,
NT