如何在WPF应用程序中设置TextBlock和Label的默认颜色,字体系列和字体大小?

mob*_*ofu 5 windows wpf label themes textblock

编辑:我想这个问题没有说清楚.它实际上由4个独立的组成:

  1. TextBlock如果客户端应用程序不以编程方式或通过xaml提供任何样式,如何获取其默认颜色?
  2. 如何Label获得其默认颜色?
  3. TextBlock如果客户端应用程序不以编程方式或通过xaml提供任何样式,如何获取其默认字体大小和字体系列?
  4. 如何Label获得其默认字体大小和字体系列?

顺便说一下,问题不在于如何更改或定义a TextBlock或a 的颜色/字体大小/字体系列的样式Label,尽管它们在某种程度上是相关的.我想我已经知道了#2的答案,这是LabelSystemColors.ControlTextBrushKey得到它的颜色,并通过覆盖ConrolTextBrushKey如下:

<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>
Run Code Online (Sandbox Code Playgroud)

你可以"全局"改变Labels的颜色.经过一番研究,我想我也找到了#1的答案是:TextBlock继承从含有其它的前景色Window,在默认情况下得到的Foreground,从颜色SystemColors.WindowTextBrushKey.通过为WindowTextBrush定义颜色,如下所示:

<Window.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}" 
                     Color="Yellow"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

您可以更改TextBlock内部s 的"前景"颜色Window.

问题#3和#4对我来说仍然是难题,但我假设它们与SystemFonts有关.

希望这是有道理的.我真的很想知道答案,因为他们一直在困扰我.非常感谢!

以下是原帖:


如果您查看LabelWindows附带的主题中的a样式(例如"aero.normalcolor.xaml"),您可以找到

<Setter Property="Foreground" 
        Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
Run Code Online (Sandbox Code Playgroud)

哪个设置了颜色Label.但是FontSize在样式中没有指定属性的位置,我认为这与SystemFonts有关.对于a 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>
Run Code Online (Sandbox Code Playgroud)

a Label或者a 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>
Run Code Online (Sandbox Code Playgroud)

Pav*_*lov 7

至于我记得,在大多数情况下类,比如TextBlock,TextBox和其他许多人采取从文本的颜色TextElement.Foreground属性.属性值在整个可视化树中继承,即您可以将其设置在根元素上,并使大部分文本更改其颜色.例如:

<Grid TextElement.Foreground="Red">
  <TextBlock Text="test"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

实际上,即使对于标签也是如此:默认样式的setter只是将其设置TextElement.Foreground为系统颜色之一.

但是,这仅适用于默认的控件状态.改变状态,如突出显示,不是继承的,而是取自系统颜色,正如Rachel所写.

UPDATE

对于FontSize和,情况也是如此FontFamily.它们是TextElement附加了属性用法的类的属性.他们继承了他们的价值观.在可视树项上设置值后,其所有子项将获得相同的值.除非他们通过显式属性赋值或样式等覆盖它.

再次,文本颜色字体大小和字体族是由的值支配TextElement.Foreground,TextElement.FontSizeTextElement.FontFamily一个特定的视觉元件上附着的依赖特性.

一些控件,比如Label明确设置Foreground一些画笔.它发生在刷子是其中之一SystemColors.但并非所有控件都适用.其他(TextBlock,TextBox等)不会覆盖属性值,只使用启动时评估的一些默认设置.同样的事情发生在FontSizeFontFamily.您无需在任何地方设置它们以便它们工作.这就是WPF的工作原理.

据推测,这些值取决于系统主题.我相信他们会在应用启动期间进行评估.也许它们是可配置的.

更新2

您的新问题的答案:

如果客户端应用程序没有以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认颜色?

它从TextElement.Foreground附加的依赖属性的继承值中获取它.默认情况下,它从根视觉元素继承,而视觉元素又简单地设置为依赖属性(Brushes.Black)的默认值.也可以看看

Label如何获得其默认颜色?

它从TextElement.Foreground附加的依赖属性的值中获取它.由于其默认样式将其设置为{DynamicResource {x:Static SystemColors.ControlTextBrushKey},因此它将绑定到系统颜色.

如果客户端应用程序不以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认字体大小和字体系列?

与其文字颜色相同.MSDN表示,字体大小的默认值是SystemFonts.MessageFontSize,它取决于系统设置.字体系列的确定方式与SystemFonts.MessageFontFamily类似.FrameworkPropertyMetadataTextElement静态构造函数中依赖属性注册时,这两个默认值都将传递给构造函数.

更深入:SystemFonts.MessageFontFamilySystemFonts.MessageFontSize包装内部SystemParameters.NonClientMetrics,然后从WIN32原生SystemParametersInfo http://msdn.microsoft.com/en-us/library/ms724947检索.因此,WPF与所有Windows UI的东西紧密集成,如主题,字体等.

Label如何获得其默认字体大小和字体系列?

同样的TextBlock.Label衍生自ContentControl哪来源于Control.Control类添加本身作为的所有者TextElement.FontFamilyTextElement.FontSize属性具有相同的默认值.

也可以看看:

属性值继承

更新3

您应该了解主要想法:值是继承的.这意味着它们可以从任何地方继承任何控制.您可以确切地确定它仅从某个逻辑树结构继承的是哪一个.你改变了一点 - 颜色改变了.有人明确设置属性的值 - 所有子节点都将继承该值.因此,你的问题几乎没有实际意义.但从WPF未定的角度来看,它们仍然很有趣.

覆盖默认值

虽然您无法更改SystemFonts属性的值(它们是只读的),但您不必这样做.要更改整个窗口的字体大小和系列,只需将所需的值分配给TextElement附加的属性Window:

<Window TextElement.FontSize="20" TextElement.FontFamily="Century Gothic">
  ..
</Window>
Run Code Online (Sandbox Code Playgroud)

并且所有未显式覆盖继承的控件都将收到设置.对于那些覆盖的人 - 你必须覆盖他们的默认样式,如果他们对值进行硬编码,甚至会抛弃它们.

相同的方法适用于TextElement.Foreground(Background和等等).


Rac*_*hel 4

默认颜色取自操作系统的设置。

您可以通过创建具有引用SystemColors画笔键的键的画笔来覆盖它们

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
Run Code Online (Sandbox Code Playgroud)