【问题标题】:How to override general style with trigger in ControlTemplate?如何使用 ControlTemplate 中的触发器覆盖一般样式?
【发布时间】:2017-08-07 19:47:09
【问题描述】:

我有一个 TabControl,它为选定的选项卡显示不同的选项卡标题前景和背景。但我想在选项卡项内容控件中为 TextBlocks 设置一个通用的前景色。相反,所有标题都获得了通用的 TextBlock 前景色,并且选项卡控件在选择选项卡时不会更改标题的前景色。

所以在我的主窗口中我有:

<Grid>
    <TabControl Style="{StaticResource TabControlStyle}">
        <TabItem Header="Tab 1" IsSelected="True">
            <TextBlock Text="Text in Tab 1"/>
        </TabItem>
        <TabItem Header="Tab 2">
            <TextBlock Text="Text in Tab 2"/>
        </TabItem>
    </TabControl>
</Grid>

在我的资源文件中,我定义了我的颜色和内容模板:

<Color x:Key="DarkGray">#404040</Color>
<Color x:Key="DarkGreen">#3A5038</Color>
<Color x:Key="ForegroundColor">#FFF1F1F1</Color>

<SolidColorBrush x:Key="DarkGrayBrush"
                 Color="{StaticResource DarkGray}" />
<SolidColorBrush x:Key="ForegroundColorBrush"
                 Color="{StaticResource ForegroundColor}" />
<SolidColorBrush x:Key="DarkGreenBrush"
                 Color="{StaticResource DarkGreen}" />

<Style TargetType="TextBlock">
    <Setter Property="Foreground"
            Value="{StaticResource DarkGrayBrush}" />
</Style>

<Style x:Key="TabControlStyle"
       TargetType="TabControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TabControl">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <TabPanel Grid.Row="0"
                              Background="{TemplateBinding Background}"
                              IsItemsHost="true" />
                    <ContentPresenter Grid.Row="1"
                                      ContentSource="SelectedContent" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Resources>
        <Style TargetType="TabItem">
            <Setter Property="BorderThickness"
                    Value="0" />
            <Setter Property="FontSize"
                    Value="16" />
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Border>
                            <ContentPresenter Content="{TemplateBinding Content}" />
                        </Border>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="TabItem">
                        <Border Name="Border"
                                Width="145"
                                Margin="10"
                                Padding="0"
                                BorderThickness="0"
                                CornerRadius="20">
                            <ContentPresenter x:Name="ContentSite"
                                              Margin="10"
                                              HorizontalAlignment="Center"
                                              VerticalAlignment="Center"
                                              ContentSource="Header" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected"
                                     Value="True">
                                <Setter TargetName="Border"
                                        Property="Background"
                                        Value="{StaticResource DarkGreenBrush}" />
                                <Setter Property="Foreground"
                                        Value="{StaticResource ForegroundColorBrush}" />
                            </Trigger>
                            <Trigger Property="IsSelected"
                                     Value="False">
                                <Setter Property="Foreground"
                                        Value="{StaticResource DarkGrayBrush}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Style.Resources>
</Style>

我的目标是 Windows 10 操作系统上的 .NET 4.5。

谢谢,威尔

【问题讨论】:

    标签: wpf xaml tabcontrol controltemplate


    【解决方案1】:

    设置ContentPresenterTextBlock.Foreground属性:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TabItem">
                <Border Name="Border"
                                    Width="145"
                                    Margin="10"
                                    Padding="0"
                                    BorderThickness="0"
                                    CornerRadius="20">
                    <ContentPresenter x:Name="ContentSite"
                                                  Margin="10"
                                                  HorizontalAlignment="Center"
                                                  VerticalAlignment="Center"
                                                  ContentSource="Header" TextBlock.Foreground="{StaticResource DarkGrayBrush}" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="Border"
                                            Property="Background"
                                            Value="{StaticResource DarkGreenBrush}" />
                        <Setter TargetName="ContentSite" Property="TextBlock.Foreground"
                                Value="{StaticResource ForegroundColorBrush}" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    

    【讨论】:

    • 是的,这行不通。行为没有变化。这对你有用吗?
    • 是的。你期待什么结果,你看到了什么结果?
    • 您好,谢谢,我期望选项卡中的前景色在选择时变为“前景色”,否则所有文本均为深灰色。我看到的是所有文本都是深灰色的,无论选择什么。
    • 您是否真的在您的ControlTemplate 中设置了ContentPresenterTextBlock.Foreground 属性?这对我有用:&lt;Setter TargetName="ContentSite" Property="TextBlock.Foreground" Value="Blue" /&gt;
    • 是的,事实上,我只是将您的模板设置器复制到我的示例应用程序中。您是否使用单独的资源文件?
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2011-05-11
    • 1970-01-01
    • 2011-01-15
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多