编辑:我猜这个问题没有说清楚。它实际上由4个独立的组成:
TextBlock
如何获得其默认颜色? Label
如何获得默认颜色?TextBlock
如何获得其默认字体大小和字体系列?Label
如何获得其默认字体大小和字体系列? BTW,问题不是关于如何更改或定义TextBlock
或Label
的颜色/字体大小/字体系列的样式,尽管它们是不知何故相关。我想我已经知道了#2的答案,即Label
从SystemColors.ControlTextBrushKey得到它的颜色并覆盖ConrolTextBrushKey
,如下所示:
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>
您可以“全局”更改Label
的颜色。经过一些研究,我想我也找到了#1的答案:A TextBlock
从其包含的Window
继承了它的前景颜色,默认情况下它从{{3}获得Foreground
颜色}}。通过定义WindowTextBrush的颜色,如下所示:
<Window.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}"
Color="Yellow"/>
</Window.Resources>
您可以更改TextBlock
内Window
的“前景”颜色。
问题#3和#4对我来说仍然是个难题,但我假设它们与SystemColors.WindowTextBrushKey有关。
希望这是有道理的。我真的很想知道答案,因为他们一直在困扰我。非常感谢!
以下是原帖:
如果您查看Windows附带的主题Label
的样式(例如“aero.normalcolor.xaml”),您可以找到
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
设置Label
的颜色。但是没有在样式中指定FontSize
属性的地方,我认为这与SystemFonts有关。对于TextBlock
,它看起来更神秘,因为“aero.normalcolor.xaml”中的样式只有4行:
<Style x:Key="{x:Type TextBlock}"
TargetType="{x:Type TextBlock}">
<Setter Property="TextWrapping"
Value="NoWrap"/>
<Setter Property="TextTrimming"
Value="None"/>
</Style>
Label
或TextBlock
从哪里获取颜色和字体大小/系列的值,如果应用程序未设置任何值,以及WPF中的这些挂钩在哪里?
编辑:
这是试图将TextBlock
颜色设置为SystemColors.ControlTextBrush
的试驾(假设TextBlock
获取其默认颜色,这似乎是假的):
<Window x:Class="TestFontColor.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<StackPanel.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>
</StackPanel.Resources>
<Button Content="This is red."/>
<Label Content="This is blue.">
<Label.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Blue"/>
</Label.Resources>
</Label>
<TextBlock Text="TextBlock: This is still black."/>
</StackPanel>
答案 0 :(得分:7)
据我记忆,在大多数情况下,TextBlock
,TextBox
等类和其他许多类都使用TextElement.Foreground
属性中的文字颜色。属性值在整个可视化树中继承,即您可以将其设置在根元素上,并使大部分文本更改其颜色。例如:
<Grid TextElement.Foreground="Red">
<TextBlock Text="test"/>
</Grid>
事实上,即使对于标签也是如此:默认样式的setter只是将TextElement.Foreground
设置为系统颜色之一。
但是,这仅适用于默认的控件状态。改变状态,如突出显示,不是继承的,而是取自系统颜色,正如Rachel所写。
<强>更新强>
FontSize
和FontFamily
也是如此。它们是附加了属性用法的TextElement
类的属性。他们继承了他们的价值观。在可视树项上设置值后,其所有子项将获得相同的值。除非他们通过显式属性赋值或样式等覆盖它。
文字颜色字体大小和字体系列再次由特定视觉元素上TextElement.Foreground
,TextElement.FontSize
和TextElement.FontFamily
附加依赖项属性的值控制。
某些控件(例如Label
)明确将其Foreground
设置为某些画笔。它发生在刷子是SystemColors
之一。但并非所有控件都适用。其他(TextBlock
,TextBox
等)不会覆盖属性值,只使用启动时评估的一些默认设置。 FontSize
和FontFamily
也是如此。 您无需在任何地方设置它们以便它们正常工作。这就是WPF的工作原理。
据推测,值取决于系统主题。我相信他们会在应用启动期间进行评估。也许它们是可配置的。
更新2
您的新问题的答案:
如果客户端应用程序没有以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认颜色?
它从TextElement.Foreground
附加依赖项属性的继承值中获取。默认情况下,它继承自根视觉元素,而视觉元素又简单地设置为依赖项属性(Brushes.Black
)的默认值。 See also
Label如何获得其默认颜色?
从TextElement.Foreground
附加依赖项属性的值中获取它。由于其默认样式将其设置为{DynamicResource {x:Static SystemColors.ControlTextBrushKey}
,因此它将绑定到系统颜色。
如果客户端应用程序没有以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认字体大小和字体系列?
与其文字颜色相同。 MSDN说,字体大小的默认值是SystemFonts.MessageFontSize,这取决于系统设置。字体系列的确定方式与SystemFonts.MessageFontFamily类似。
在FrameworkPropertyMetadata
静态构造函数中依赖属性注册后,这两个默认值都将传递给TextElement
构造函数。
更深入:SystemFonts.MessageFontFamily
和SystemFonts.MessageFontSize
包装内部SystemParameters.NonClientMetrics
,后者又从WIN32原生SystemParametersInfo
http://msdn.microsoft.com/en-us/library/ms724947中检索。因此,WPF与主题,字体等所有Windows UI紧密集成。
Label如何获得其默认字体大小和字体系列?
与TextBlock
相同。 Label
来自ContentControl
,Control
来自Control
。 TextElement.FontFamily
类将自己添加为TextElement.FontSize
和SystemFonts
属性的所有者,并使用相同的默认值。
另见:
更新3
您应该了解主要想法:值是继承的。这意味着它们可以从任何地方继承任何控制。您可以确切地确定它仅从某个逻辑树结构继承的是哪一个。你改变了一点 - 颜色改变了。有人明确设置属性的值 - 所有子节点都将继承该值。因此,你的问题几乎没有实际意义。但从WPF未定的角度看,它们仍然很有趣。
覆盖默认值
虽然您无法更改TextElement
属性的值(它们是只读的),但您不必这样做。要更改整个窗口的字体大小和系列,只需将所需的值分配给Window
上的<Window TextElement.FontSize="20" TextElement.FontFamily="Century Gothic">
..
</Window>
附加属性:
TextElement.Foreground
并且所有未显式覆盖继承的控件都将收到设置。对于那些覆盖的人 - 你必须覆盖他们的默认样式,如果他们对值进行硬编码,甚至会抛弃它们。
同样的方法适用于Background
(和{{1}}等等。)
答案 1 :(得分:2)
默认颜色是从操作系统的设置中提取的。
您可以通过创建一个刷子来覆盖它们,该刷子具有一个引用SystemColors刷子键的键
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
答案 2 :(得分:0)
根据这个:http://msdn.microsoft.com/en-us/library/ms788718.aspx
默认情况下,WPF在Windows \ Fonts目录中使用GlobalUserInterface.composite字体。
根据这个:http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock.fontsize(v=vs.95).aspx
指定字体大小的非负值,以像素为单位。默认值为11。
此外,您还可以找到存储在MSDN网站中不同位置的许多其他默认值:http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock.fontstyle(v=VS.95).aspx表示样式,其中包含:
请求的字体样式,即从其中一个FontStyles属性值获取的FontStyle。默认值为“正常”。