WPF Button ControlTemplate 不会覆盖 Inherited Foreground
WPF Button ControlTemplate won't override Inherited Foreground
我的 Button
的全局 (App.xaml
) ControlTemplate 不想覆盖 Foreground
属性 的默认黑色。这似乎是一个相对常见的问题,但我尝试了各种解决方案,包括将 BasedOn
设置为 null
as 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>
...
事实证明,使用此样式的按钮将其内容设置为文本以外的内容,或者在内部明确添加了无样式的 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
的纯字符串,它就可以工作。现在我要花一些时间研究 the inheritance rules for attached properties,因为我认为我有大约 51% 的半自信这不是我通常想要的行为。
我的 Button
的全局 (App.xaml
) ControlTemplate 不想覆盖 Foreground
属性 的默认黑色。这似乎是一个相对常见的问题,但我尝试了各种解决方案,包括将 BasedOn
设置为 null
as 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>
...
事实证明,使用此样式的按钮将其内容设置为文本以外的内容,或者在内部明确添加了无样式的 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
的纯字符串,它就可以工作。现在我要花一些时间研究 the inheritance rules for attached properties,因为我认为我有大约 51% 的半自信这不是我通常想要的行为。