TextBlock 样式覆盖模板化父样式

Posted

技术标签:

【中文标题】TextBlock 样式覆盖模板化父样式【英文标题】:TextBlock style overwrites Templated parent style 【发布时间】:2012-10-06 09:05:38 【问题描述】:

首先,我在应用程序资源中有一个样式作为资源,如下所示:

<Style x:Key="ContentTextBlock" TargetType="FrameworkElement">
   <Setter Property="TextBlock.HorizontalAlignment" Value="Center"/>
   <Setter Property="TextBlock.VerticalAlignment" Value="Center"/>
   <Setter Property="TextBlock.FontFamily" Value="Verdana"/>
   <Setter Property="TextBlock.FontSize" Value="12"/>
   <Setter Property="TextBlock.FontWeight" Value="Normal"/>
   <Setter Property="TextBlock.Foreground" Value="Orange"/>
</Style>

我创建了一个自定义控件,其中包含标题和内容。 这是自定义控件模板中内容部分的外观:

<ContentPresenter Content="TemplateBinding Content"
                  Style="DynamicResource ContentTextBlock">
</ContentPresenter>

我的问题是,如果我像这样使用创建的控件:

<local:CutPage.Content>
            <TextBlock>Header</TextBlock>
</local:CutPage.Content>

Fontsize、FontWeight 和 FontFamily 被 TextBlock 的显式或默认样式覆盖(我认为是这种情况,但我不确定)。我已阅读有关dependebcy 值顺序od 优先级的文章,但我怎么能猜出是什么覆盖了我的模板样式?我希望进入自定义控件的所有标题元素都使用这些值。我该怎么做?

附:有趣的是,一些样式设置器可以工作(比如将文本垂直和水平居中),而其他的则不行!

【问题讨论】:

【参考方案1】:

如果您想保留您的 CustomControl,您必须定义与文本块属性匹配的依赖属性,并在您的 ControlTemplate 中进行绑定。

我要做的是创建一个从 TextBox 派生的 CustomControl,然后更改它的 ControlTemplate 以添加您需要的内容并将您需要的所有内容绑定到他的 ControlTemplate。

或者,您可以只使用似乎完全符合您需要的 HeaderedContentControl

<HeaderedContentControl FontFamily="Arial" Foreground="Red" Header="Hello World">
    <Rectangle Width="10" Height="10" Fill="Blue" />
</HeaderedContentControl>

【讨论】:

【参考方案2】:

你能不能把你的基本样式放在一个单独的文件中,然后在你的文本块中使用它继承它,就像这样:

<TextBlock>
<Style TargetType="..." BasedOn="StaticResource MyGeneralStyle">                       <Setter Property="Foreground" Value="..."/>
</Style>
</TextBlock>

【讨论】:

以上是关于TextBlock 样式覆盖模板化父样式的主要内容,如果未能解决你的问题,请参考以下文章

设置TextBlock默认样式后,其他控件的Text相关属性设置失效问题

设置TextBlock默认样式后,其他控件的Text相关属性设置失效问题

无法覆盖由 TargetType 在单个特定控件上设置的全局 WPF 样式

WPF为啥改变TextBlock字体Button,Label等控件的字体都变了

WPF 定义了TextBlock样式后,其他控件的样式都改变了

在 DataGridTextColumn 中为 TextBlock 创建样式