WPF样式tabitem文本前景触发器,如IsEnabled,IsMouseOver等

时间:2009-07-15 08:28:52

标签: c# wpf tabcontrol styling tabitem

我正在尝试使用触发器更改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

5 个答案:

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