关于xaml:WPF按钮样式未应用于子元素

WPF button style not being applied to child element

我有这样的按钮样式

1
2
3
4
5
6
7
8
<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的样式在哪里

1
2
3
<Style x:Key="NormalButtonTextStyle" BasedOn="{StaticResource DefaultFontStyle}">
    <Setter Property="TextElement.Foreground" Value="{DynamicResource NormalTextOnDarkBackgroundBrush}" />
...

所以我就这样定义了我的按钮

1
2
3
4
<Button Style="{StaticResource NormalButtonStyle}">
    <Button.Content>
        <TextBlock Text="Cancel"/>
...

但是TextBlock并没有以NormalButtonTextStyle样式结束。 我在运行时检查了元素,内容演示者肯定具有正确的文本前景,但是子TextBlock最终继承了完全不同的内容,并得到了ControlTextBrush的前景。

我是否误解了样式如何应用于子元素? 我应该如何定义按钮,以便正确应用样式?


添加到Button style

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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>


请看看这个。"在这种情况下,正确的样式应位于ContentPresenter内部,在这种情况下,ContentPresenter不属于逻辑树。"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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>


其他答案可能是解决此问题的正确方法,但是不幸的是,样式已在大型应用程序中使用,因此我更喜欢只影响按钮的解决方案。 Parisa所关联的问题有所帮助; 我需要直接设置按钮的内容,以便文本的父项是ContentPresenter:

1
<Button Content="Cancel" Style="{StaticResource NormalButtonStyle}"/>