2009-07-15 3 views
0

Я пытаюсь изменить цвет текста переднего плана текстового блока заголовка элемента WPF с помощью триггеров. Это отлично подходит для большинства (более простых) сценариев, но не тогда, когда TextBlocks были в глобальном стиле.WPF stiting tabitem text foreground после запуска, например IsEnabled, IsMouseOver и т. Д.

Так что это просто «мыши над» триггером будут работать с точкой зрения изменения цвета переднего плана:

<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

ответ

2

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

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

к этому:

<Setter Property="Foreground" Value="White"/> 
0

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

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

EDIT

Как это

Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, AncestorLevel=1}, Path=Foreground}" 
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 и связывается с его переднего плана собственности.

0

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

Мое намерение состояло в том, чтобы изменить текст 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 ресурсов. Итак, очевидно, что теперь любые текстовые блоки в ContentPresenter должны использовать свойство Forefront родителя, и это будет иметь приоритет из-за принудительного значения стоимости, решая мою проблему.

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

NT