App.xaml
的全局(Button
)ControlTemplate并不想要从默认的黑色着色中覆盖Foreground
属性。这似乎是一个相对常见的问题,但我尝试了各种解决方案,包括将BasedOn
设置为null
为described in this question。
我的代码如下,您可以看到我已尝试在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>
...
答案 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%的半信心,这不是我通常想要的行为。