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

时间:2011-12-12 18:47:26

标签: wpf windows themes label textblock

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

  1. 如果客户端应用程序没有以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认颜色?
  2. Label如何获得默认颜色?
  3. 如果客户端应用程序没有以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认字体大小和字体系列?
  4. Label如何获得其默认字体大小和字体系列?
  5. BTW,问题不是关于如何更改或定义TextBlockLabel的颜色/字体大小/字体系列的样式,尽管它们是不知何故相关。我想我已经知道了#2的答案,即LabelSystemColors.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>
    

    您可以更改TextBlockWindow的“前景”颜色。

    问题#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>
    

    LabelTextBlock从哪里获取颜色和字体大小/系列的值,如果应用程序未设置任何值,以及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>
    

3 个答案:

答案 0 :(得分:7)

据我记忆,在大多数情况下,TextBlockTextBox等类和其他许多类都使用TextElement.Foreground属性中的文字颜色。属性值在整个可视化树中继承,即您可以将其设置在根元素上,并使大部分文本更改其颜色。例如:

<Grid TextElement.Foreground="Red">
  <TextBlock Text="test"/>
</Grid>

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

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

<强>更新

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

文字颜色字体大小和字体系列再次由特定视觉元素上TextElement.ForegroundTextElement.FontSizeTextElement.FontFamily附加依赖项属性的值控制。

某些控件(例如Label)明确将其Foreground设置为某些画笔。它发生在刷子是SystemColors之一。但并非所有控件都适用。其他(TextBlockTextBox等)不会覆盖属性值,只使用启动时评估的一些默认设置。 FontSizeFontFamily也是如此。 您无需在任何地方设置它们以便它们正常工作。这就是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.MessageFontFamilySystemFonts.MessageFontSize包装内部SystemParameters.NonClientMetrics,后者又从WIN32原生SystemParametersInfo http://msdn.microsoft.com/en-us/library/ms724947中检索。因此,WPF与主题,字体等所有Windows UI紧密集成。

  

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

TextBlock相同。 Label来自ContentControlControl来自ControlTextElement.FontFamily类将自己添加为TextElement.FontSizeSystemFonts属性的所有者,并使用相同的默认值。

另见:

Property Value Inheritance

更新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。默认值为“正常”。