【问题标题】:Overriding default TextBlock style on a ContentPresenter in a ControlTemplate覆盖 ControlTemplate 中 ContentPresenter 的默认 TextBlock 样式
【发布时间】:2016-02-26 21:29:21
【问题描述】:

我找到了很多针对同一问题的回复,但没有一个可以真正回答我所知道的问题...我正在尝试将我的应用程序的默认 GroupBox 样式中的标题前景设置为与其他内容不同的颜色。考虑以下几点:

<Style TargetType="{x:Type GroupBox}">
    <Setter Property="FontSize" Value="18"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <ContentPresenter TextElement.Foreground="Green" Content="{TemplateBinding Header}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

现在,如果我将 GroupBox 上的标题设置为像这样的字符串,则字体正确为绿色:

<Grid>
    <GroupBox Header="Header Text"/>
</Grid>

但是,如果我将其更改为标题是控件,则不会应用样式中的字体颜色:

<Grid>
    <GroupBox>
        <GroupBox.Header>
            <TextBlock Text="Header Text"/>
        </GroupBox.Header>
    </GroupBox>
</Grid>

据我了解,这是因为 ContentPresenter 在第一个示例中只有一个字符串,因此它正在创建 TextBlock 本身,因此是它在可视化树中的父级,而在第二个示例中是内容首先创建,然后插入 ContentPresenter 本来应该存在的位置。

所以我知道为什么会发生这种情况......但我一直无法找到一个好的解决方法。在其他示例中,我看到人们通常最终显式模板化内容,但这只是我的应用程序的默认样式,因此我没有内容可以显式设置任何内容。

【问题讨论】:

  • 可以设置默认颜色,但适用于您在 GroupBox 中的所有TextBlocks,包括GroupBox 的内容。可以吗?

标签: wpf xaml


【解决方案1】:

如果这个GroupBox 是一次或两次的事情,那么我建议只是简单地给有问题的GroupBox 一个x:Name="Whatever",然后绑定你想要它的所有TextBlock 的属性继承说GroupBox。 例如:

<TextBlock FontSize="{Binding Elementname=Whatever, Path=FontSize}"/>

或者,如果你想避免名字,你可以说......

<TextBlock FontSize="{Binding RelativeSource={RelativeSource, Mode=FindAncestor, AncestorType={x:Type GroupBox}, Path=FontSize}"/>

从理论上讲,这将允许您将所有内容转储到一个 TextBlock 样式中,您可以将其命名为“GroupBoxHeaderTextBlockStyle”或类似的未来场景中使用的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-01-13
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多