WPF стилизует текст переднего плана текста после триггера, например IsEnabled, IsMouseOver и т. - PullRequest
0 голосов
/ 15 июля 2009

Я пытаюсь изменить цвет текста переднего плана текстового блока заголовка элемента вкладки 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 ]

2 голосов
/ 04 октября 2012

Эта ссылка может вам помочь. Изменение цвета переднего плана contentpresenter в списке В нем объясняется, как изменить цвет переднего плана для contentpresenter.

1 голос
/ 15 июля 2009

У меня работает. Просто пришлось изменить это:

<Setter Property="Foreground" Value="False"/>

к этому:

<Setter Property="Foreground" Value="White"/>
0 голосов
/ 15 июля 2009

Большое спасибо за вашу помощь, вы успешно направили меня в правильном направлении.

Мое намерение состояло в том, чтобы изменить текст TabItem (созданный WPF ContentPresenter), а не TextBlock внутри вкладки, который объявлен в XAML и может легко изменить цвет.

Проблема была в том, что глобальный стиль имеет приоритет. И поскольку 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>

Как видите, я установил стиль TextBlock в ресурсах ContentPresenter. Поэтому очевидно, что теперь любые TextBlocks в ContentPresenter должны использовать свойство Foreground родителя, и это будет иметь приоритет из-за приведения значения, решая мою проблему.

Большое спасибо всем,

NT

0 голосов
/ 15 июля 2009

Я имел в виду следующее:

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

Привязка находит родительский элемент TabItem и привязывается к его свойству Foreground.

0 голосов
/ 15 июля 2009

Вы устанавливаете цвет переднего плана TabItem на Red, а не TextBlock. Возможно, стиль TextBox не унаследован от TabItem, потому что заданные пользователем неявные стили имеют приоритет над установщиками триггеров.

Попробуйте добавить привязку к родительскому свойству TabItem Foreground родительского элемента TextBlock.

EDIT

Как это

Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, AncestorLevel=1}, Path=Foreground}"
...