0

トリガーを使用して、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>

問題は、(一貫した外観を維持するために) App.xaml で TextBlocks がグローバルにスタイル設定されている場合、前景は変更されず、グローバルにスタイル設定された前景色が保持されることです。これは、私の 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

4

4 に答える 4

1

私のために働きます。これを変更する必要がありました:

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

これに:

<Setter Property="Foreground" Value="White"/>
于 2009-07-15T08:58:21.497 に答える
0

あなたの助けに感謝します。あなたは私を正しい方向に導くことに成功しました。

私の意図は、XAML で宣言され、簡単に色を変更できるタブ内の TextBlock とは対照的に、TabItem のテキスト (WPF の ContentPresenter によって作成) を変更することでした。

問題は、優先されるグローバル スタイルにありました。また、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 内の TextBlocks は親の Foreground プロパティを使用する必要があり、値の強制によりこれが優先され、問題が解決されます。

皆様、本当にありがとうございました。

NT

于 2009-07-15T10:40:46.110 に答える
0

TextBlock ではなく、TabItem の前景色を赤に設定しています。ユーザー セットの暗黙的なスタイルがトリガー セッターよりも優先されるため、TextBox スタイルは TabItem から継承されない可能性があります。

TextBlock の親である TabItem Foreground プロパティにバインディングを追加してみてください。

編集

このような

Foreground="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}, AncestorLevel=1}, Path=Foreground}"
于 2009-07-15T09:33:55.357 に答える