WPF Button ControlTemplate不会覆盖Inherited Foreground

时间:2016-10-28 12:50:17

标签: c# wpf xaml wpf-controls

App.xaml的全局(Button)ControlTemplate并不想要从默认的黑色着色中覆盖Foreground属性。这似乎是一个相对常见的问题,但我尝试了各种解决方案,包括将BasedOn设置为nulldescribed in this question

我的代码如下,您可以看到我已尝试在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>
...

2 个答案:

答案 0 :(得分:1)

事实证明,使用此样式的按钮将其内容设置为文本以外的内容,或者在内部显式添加无样式TextBlock,这覆盖了Foreground属性设置的任何内容。原始代码。

确保文本被设置为按钮内容,或确保其包装器的样式正确,修复了问题。

看来橡皮鸭调试毕竟是有效的。

答案 1 :(得分:1)

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

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

我可以向Label添加隐式ControlTemplate.Resources样式,该样式会覆盖Label的{​​{1}},但尝试为每个{1}}设置本地隐式样式会很荒谬可能的控制有人可以放在那里。

但是如果你只是坚持Foreground的简单字符串,它就会起作用。现在我要花一些时间来研究the inheritance rules for attached properties,因为我认为我有51%的半信心,这不是我通常想要的行为。