WPF按钮控制模板不会覆盖继承的前景

本文关键字:继承 覆盖 按钮 控制 WPF | 更新日期: 2023-09-27 18:15:20

我的全局(App.xaml) ControlTemplate for Button不想从其默认的黑色覆盖Foreground属性。这似乎是一个相对常见的问题,但我已经尝试了各种解决方案,包括将BasedOn设置为null,如本问题所述。

我的代码如下,你可以看到我已经试图明确地说明前景色的GridContentPresenter。然而颜色仍然是黑色的。Snoop告诉我它是默认继承的,虽然似乎没有说从哪里,并显示父ContentPresenterTextElement.Foreground设置为正确的颜色。

这段代码中有我应该设置的东西吗?我是否遗漏了一个元素或属性?

<Style TargetType="Button">
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid x:Name="grid" TextBlock.Foreground="#FFD3D3D2">
                    <Border x:Name="border" Background="Transparent" BorderBrush="#FF5C7999" BorderThickness="2" CornerRadius="{Binding RelativeSource={RelativeSource TemplatedParent},Path=ActualHeight,Converter={StaticResource HalfConverter}}" Padding="10">
                        <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="10,0" TextBlock.Foreground="#FFD3D3D2">
                        </ContentPresenter>
                    </Border>
                </Grid>
...

WPF按钮控制模板不会覆盖继承的前景

结果是使用这种样式的按钮将其内容设置为文本以外的内容,或者显式地在其中添加无样式的TextBlock,并且这覆盖了原始代码中Foreground属性设置的任何内容。

确保只有文本被设置为按钮内容,或者确保其包装样式适当,解决了这个问题。

看来橡皮鸭调试还是管用的。

对此进行测试,如果Button.Content是字符串,则Style可以按预期工作,但如果它是控件则不可以:

<StackPanel>
    <Button Content="Gray Text As Specified in the ControlTemplate" />
    <Button><Label>Default Black Text</Label></Button>
</StackPanel>

我可以添加一个隐式的Label风格的ControlTemplate.Resources覆盖LabelForeground,但这将是荒谬的,试图有本地隐式风格的每一个可能的控制有人可以放在那里。

但是,如果您只是坚持使用Content的普通字符串,它将工作。现在我将花一些时间研究附加属性的继承规则,因为我认为我有51%的信心认为这不是我通常想要的行为。