大家好,这是一个让我疯狂了几天的问题。
简单地说,每当我在从TextBlock控件派生的任何东西上声明前景色时,前景色在设计时被识别,但在运行时它总是默认为黑色。
就像在控件上忽略foreground属性一样。
因此,例如通常我希望以下内容呈现带有白色文本的按钮:
<Button x:Name="MyButton" Content="Hello World" Foreground="White" ... />
然而,这会呈现一个按钮,前景文本颜色为黑色。它实际上忽略了Foreground setter属性。
让它按预期工作的唯一方法是执行以下操作:
<Button x:Name="MyButton" .... >
<TextBlock Text="Hello World" Foreground="White"/>
</Button>
这种方式有效,按钮可以正确显示白色文字。但我知道我不应该像这样明确定义按钮textblock。
从文本块派生的任何内容都会出现相同的行为。
有谁知道为什么会这样?
更新 我检查了我的解决方案是否适用于TextBox。我在TextBlock上定义了自己的样式:
<Style x:Key="TextBlockText" TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="#FF63798F"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="VerticalAlignment" Value="Bottom"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
</Style>
您可以看到为前景定义了一个值。 然而当我从资源字典中删除此样式时,上述问题仍然存在。
其他信息是我使用的是MahApps.Metro库,我想知道这是否会导致问题。
有没有人有任何其他想法?甚至想到哪里调查?
答案 0 :(得分:2)
WPF中的每个控件都有一个与之关联的模板。我想某种方式在你的按钮上定义了一个不计算前景属性的样式。
例如,
<Style x:Key="DialogButtonStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Ellipse Fill="{TemplateBinding Background}"
Stroke="{TemplateBinding BorderBrush}"/>
<TextBlock Foreground="{TemplateBinding Foreground}">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/></TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
您可以使用Style = {StaticResource DialogButtonStyle}并为Button定义前景。看到这里我们在TextBlock的前景上使用了TemplateBinding而不是定义其中的颜色。
答案 1 :(得分:1)
我建议保持TextBlock样式不变,并在Button或其他控件中,在Template级别添加一个具有TextBlock样式的新资源。它将在该模板的域中,因此它不会影响其他文本块,但会覆盖主TextBlock的样式。
例如:
<ControlTemplate>
<Grid>
<Grid.Resources>
<!-- Put a new/duplicate TextBlock Style here with
the appropriate Foreground color, or TemplateBinding
and it will override it for this Grid's children -->
</Grid.Resources>
<TextBlock />
</Grid>
</ControlTemplate>