WPF按钮控制模板不会覆盖继承的前景
本文关键字:继承 覆盖 按钮 控制 WPF | 更新日期: 2023-09-27 18:15:20
我的全局(App.xaml
) ControlTemplate for Button
不想从其默认的黑色覆盖Foreground
属性。这似乎是一个相对常见的问题,但我已经尝试了各种解决方案,包括将BasedOn
设置为null
,如本问题所述。
我的代码如下,你可以看到我已经试图明确地说明前景色的Grid
和ContentPresenter
。然而颜色仍然是黑色的。Snoop告诉我它是默认继承的,虽然似乎没有说从哪里,并显示父ContentPresenter
有TextElement.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>
...
结果是使用这种样式的按钮将其内容设置为文本以外的内容,或者显式地在其中添加无样式的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
覆盖Label
的Foreground
,但这将是荒谬的,试图有本地隐式风格的每一个可能的控制有人可以放在那里。
但是,如果您只是坚持使用Content
的普通字符串,它将工作。现在我将花一些时间研究附加属性的继承规则,因为我认为我有51%的信心认为这不是我通常想要的行为。