据我记得,在大多数情况下,类似的课程TextBlock
, TextBox
和许多其他人从TextElement.Foreground
财产。该属性值在整个可视化树中继承,即您可以在根元素上设置它并让大部分文本更改其颜色。例如:
<Grid TextElement.Foreground="Red">
<TextBlock Text="test"/>
</Grid>
事实上,即使对于标签也是如此:默认样式的设置器只是简单地设置TextElement.Foreground
为系统颜色之一。
但是,这仅适用于控件的默认状态。正如 Rachel 所写,改变的状态(例如突出显示)不是继承的,而是从系统颜色中获取的。
UPDATE
对于FontSize
and FontFamily
。它们是TextElement
具有附加属性用法的类。他们继承了自己的价值观。一旦您在可视化树项上设置了值,它的所有子项都将获得相同的值。除非他们通过显式属性分配或样式等来覆盖它。
再次强调,文本颜色、字体大小和字体系列由以下值决定:TextElement.Foreground
, TextElement.FontSize
and TextElement.FontFamily
特定视觉元素上附加的依赖属性。
一些控件,例如Label
明确设置他们的Foreground
到一些刷子。发生这种情况时,刷子是其中之一SystemColors
。但并非所有控件都必须如此。其他的 (TextBlock
, TextBox
等)不要覆盖属性值,而只是使用启动时评估的一些默认设置。同样的情况也发生在FontSize
and FontFamily
. 您无需将它们设置在任何地方即可使其工作。这就是 WPF 的工作原理。
据说,这些值取决于系统主题。我相信它们是在应用程序启动期间进行评估的。也许它们是可配置的。
UPDATE 2
您的新问题的答案:
如果客户端应用程序不以编程方式或通过 xaml 提供任何样式,TextBlock 如何获取其默认颜色?
它从继承的值中获取TextElement.Foreground
附加依赖属性。默认情况下,它是从根视觉元素继承的,而根视觉元素又简单地设置为依赖属性的默认值(Brushes.Black
). See also http://msdn.microsoft.com/en-us/library/system.windows.documents.textelement.foreground.aspx
标签如何获得其默认颜色?
它从值中获取TextElement.Foreground
附加依赖属性。由于其默认样式将其设置为{DynamicResource {x:Static SystemColors.ControlTextBrushKey}
,它与系统颜色绑定。
如果客户端应用程序不以编程方式或通过 xaml 提供任何样式,TextBlock 如何获取其默认字体大小和字体系列?
与其文本颜色相同。 MSDN 说字体大小的默认值为SystemFonts.MessageFontSize http://msdn.microsoft.com/en-us/library/system.windows.systemfonts.messagefontsize.aspx这取决于系统设置。字体系列以类似的方式确定SystemFonts.MessageFontFamily http://msdn.microsoft.com/en-us/library/system.windows.systemfonts.messagefontfamily.aspx。
这两个默认值都传递给FrameworkPropertyMetadata
依赖属性注册时的构造函数TextElement
静态构造函数。
更深入:SystemFonts.MessageFontFamily
and SystemFonts.MessageFontSize
包裹内部SystemParameters.NonClientMetrics
依次从 WIN32 本机检索SystemParametersInfo
http://msdn.microsoft.com/en-us/library/ms724947 http://msdn.microsoft.com/en-us/library/ms724947。因此,WPF 与所有 Windows UI 内容(例如主题、字体等)紧密集成。
标签如何获取其默认字体大小和字体系列?
与对于相同TextBlock
. Label
源自于ContentControl
这又源于Control
. Control
类将自己添加为该类的所有者TextElement.FontFamily
and TextElement.FontSize
具有相同默认值的属性。
也可以看看:
属性值继承 http://msdn.microsoft.com/en-us/library/ms753197.aspx
UPDATE 3
您应该理解主要思想:价值观是继承的。这意味着它们可以从任何地方、任何控件继承。只有对于某种逻辑树结构,你才能准确地判断出它是从哪一个继承的。你稍微改变一下——颜色就会改变。有人显式设置属性的值 - 所有子级都将继承该值。因此,你的问题没有什么实际意义。但从理解 WPF 的角度来看,它们仍然很有趣。
覆盖默认值
尽管您无法更改SystemFonts
属性(它们是只读的),您不必这样做。要更改整个窗口的字体大小和系列,只需将所需的值分配给TextElement
上的附加属性Window
:
<Window TextElement.FontSize="20" TextElement.FontFamily="Century Gothic">
..
</Window>
所有未显式覆盖继承的控件都将接收设置。对于那些确实覆盖的 - 您将必须覆盖它们的默认样式,或者如果它们对值进行硬编码,甚至将它们丢弃。
同样的方法适用于TextElement.Foreground
(and Background
等等)。