我有一个像这样的按钮样式
<Style x:Key="NormalButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid x:Name="ContentSite">
<Grid x:Name="ContainerGrid">
<ContentPresenter x:Name="Presenter" Style="{DynamicResource NormalButtonTextStyle}"/>
...
ContentPresenter的样式是
<Style x:Key="NormalButtonTextStyle" BasedOn="{StaticResource DefaultFontStyle}">
<Setter Property="TextElement.Foreground" Value="{DynamicResource NormalTextOnDarkBackgroundBrush}" />
...
然后我按照这个
定义了我的按钮<Button Style="{StaticResource NormalButtonStyle}">
<Button.Content>
<TextBlock Text="Cancel"/>
...
但TextBlock不会以NormalButtonTextStyle
样式结束。我在运行时检查了元素,内容呈现器肯定有正确的文本前景,但是子TextBlock最终继承了完全不同的东西并获得ControlTextBrush
的前景。
我是否误解了样式如何应用于子元素?我该如何定义按钮以正确应用样式?
答案 0 :(得分:2)
将<Setter />
添加到Button
style
:
<Style x:Key="NormalButtonStyle" TargetType="{x:Type Button}">
<Setter Property="TextElement.Foreground" Value="{DynamicResource NormalTextOnDarkBackgroundBrush}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid x:Name="ContentSite">
<Grid x:Name="ContainerGrid">
<ContentPresenter x:Name="Presenter" />
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 1 :(得分:1)
请查看this。 “在这种情况下,ContentPresenter中的正确样式将不在于逻辑树的一部分。”
<Style x:Key="textBlockStyle" TargetType="TextBlock">
<Setter Property="Background" Value="Blue"/>
</Style>
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<ContentPresenter>
<ContentPresenter.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle}"/>
</ContentPresenter.Resources>
</ContentPresenter>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 2 :(得分:0)
其他答案可能是解决这个问题的正确方法,但不幸的是,这些样式在一个巨大的应用程序中使用,所以我更喜欢只影响按钮的解决方案。与Parisa有关的问题有所帮助;我需要直接设置按钮的内容,以便文本的父级是ContentPresenter:
<Button Content="Cancel" Style="{StaticResource NormalButtonStyle}"/>