我正在尝试在App.xaml中定义一个全局按钮样式,它主要按照我的预期工作。但是,我只是想不通如何让Foreground正常工作。无论我做什么,我都会得到默认TextBlock的样式(将颜色设置为白色)。
<Style TargetType="{x:Type Button}">
<Setter Property="Margin" Value="3, 5" />
<Setter Property="OverridesDefaultStyle" Value="True" />
<Setter Property="FocusVisualStyle"
Value="{StaticResource ButtonFocusVisual}" />
<Setter Property="Foreground" Value="Red" />
<Setter Property="Padding" Value="5" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="gridMainButton"
RenderTransformOrigin="0.5, 0.5">
<Grid.RenderTransform>
<ScaleTransform x:Name="scaleTransform"
CenterX="0.5"
CenterY="0.5" />
</Grid.RenderTransform>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates" >
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver" />
<VisualState x:Name="Pressed">
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="scaleTransform"
Storyboard.TargetProperty="ScaleX"
Duration="0"
To="0.85" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Ellipse x:Name="ellipse"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
StrokeThickness="2"
Stroke="{StaticResource standardBackground}"
Fill="{StaticResource standardBackground}" />
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="4, 8"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我想我可以将ContentPresenter更改为TextBlock,这对于这个特定的应用程序是可以的,但我正在寻找更通用的解决方案。
谢谢,
WTS
答案 0 :(得分:8)
就像MarkusHütter所说,问题可能是您定义了TextBlock
的隐式样式,当Button Content
设置为字符串时,将创建TextBlock
你在模板中有ContentPresenter
。这个TextBlock
将获取隐式样式,这就是你遇到这个问题的原因。
您可以为TextBlock
指定DataTemplate
,为字符串创建的string
隐式样式。将以下内容添加到App.xaml
<Application ...>
<Application.Resources>
<DataTemplate xmlns:sys="clr-namespace:System;assembly=mscorlib"
DataType="{x:Type sys:String}">
<TextBlock Text="{Binding}">
<TextBlock.Resources>
<Style TargetType="{x:Type TextBlock}"/>
</TextBlock.Resources>
</TextBlock>
</DataTemplate>
<!--...-->
</Application.Resources>
</Application>
答案 1 :(得分:1)
您似乎正在使用自定义样式的文本块(如果您说前景颜色为白色),请调用此 StandardTextBlockStyle 。
在外部网格内的按钮样式中。包括这个:
<Grid x:Name="gridMainButton">
<Grid.Resources>
<Style TargetType="TextBlock" BasedOn="{StaticResource StandardTextBlockStyle}">
<Setter Property="Foreground" Value="Black"/>
</Style>
</Grid.Resources>
<!-- ...-->
</Grid>
这应该覆盖默认的TextBlock样式。
答案 2 :(得分:0)
我遇到了类似的问题,存在全局TextBlock样式,并且在需要自定义颜色/字体的其他控件中我无法覆盖它。
基于Fredrik Hedblad和Pavlo Glazkov(来自here)的答复,以下解决方案对我有效:
<DataTemplate DataType="{x:Type System:String}">
<TextBlock Text="{Binding}">
<TextBlock.Resources>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type TextBlock}}">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type FrameworkElement}}, Path=(TextElement.Foreground),
FallbackValue={StaticResource Colors_ThemeForeground_SCBrush}, TargetNullValue={StaticResource Colors_ThemeForeground_SCBrush}}"/>
</Style>
</TextBlock.Resources>
</TextBlock>
</DataTemplate>
谢谢, RDV