gpt4 book ai didi

wpf - 如何在 WPF 应用程序中设置 TextBlock 和标签的默认颜色、字体系列和字体大小?

转载 作者:可可西里 更新时间:2023-11-01 13:29:02 30 4
gpt4 key购买 nike

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

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

  • 顺便说一句,问题不在于如何更改或定义 TextBlock 的颜色/字体大小/字体系列的样式。或 Label ,虽然它们有某种关联。我想我已经知道 #2 的答案了,那就是 LabelSystemColors.ControlTextBrushKey 获取颜色并通过覆盖 ConrolTextBrushKey像这样:
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>

    您将能够“全局”更改 Label 的颜色s。经过一番研究,我想我也找到了#1 的答案:A TextBlock从其包含的 Window 继承其前景色,默认情况下会得到它的 Foreground颜色来自 SystemColors.WindowTextBrushKey .通过为 WindowTextBrush 定义颜色,如下所示:
    <Window.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}"
    Color="Yellow"/>
    </Window.Resources>

    您可以更改 TextBlock 的“前景”颜色。 Window里面的s .

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

    希望这是有道理的。我真的很想知道答案,因为它们已经困扰我一段时间了。非常感谢!

    以下是原帖:

    如果您查看 Label 的样式在 Windows 自带的主题(例如“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 中的那些钩子(Hook)在哪里?

    编辑:

    这是一个尝试设置 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>

    最佳答案

    据我所知,在大多数情况下,类像 TextBlock , TextBox和许多其他人采用 TextElement.Foreground 中的文本颜色属性(property)。属性值在整个可视化树中继承,即您可以在根元素上设置它并让大部分文本更改其颜色。例如:

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

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

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

    更新
    FontSize也是如此和 FontFamily .它们是 TextElement 的属性具有附加属性用法的类。他们继承了他们的值(value)观。在可视化树项上设置值后,其所有子项都将获得相同的值。除非他们通过显式属性分配或样式等覆盖它。

    同样,文本颜色字体大小和字体系列由 TextElement.Foreground 的值控制。 , TextElement.FontSizeTextElement.FontFamily附加在特定视觉元素上的依赖属性。

    一些控件,例如 Label明确设置他们的 Foreground来一些刷。碰巧刷子是 SystemColors 之一.但并非所有控件都必须如此。其他( TextBlockTextBox 等)不覆盖属性值,只使用在启动时评估的一些默认设置。同样发生在 FontSizeFontFamily . 您无需将它们设置在任何地方即可让它们工作 .这就是 WPF 的工作原理。

    据说,这些值取决于系统主题。我相信它们是在应用程序启动期间进行评估的。也许它们是可配置的。

    更新 2

    回答您的新问题:

    How does a TextBlock get its default color, if the client app doesn't provide any style, either programmatically or through xaml?



    它取自 TextElement.Foreground 的继承值。附加依赖属性。默认情况下,它是从根视觉元素继承的,而根视觉元素又简单地设置为依赖属性的默认值 ( Brushes.Black )。 See also

    How does a Label get its default color?



    它取自 TextElement.Foreground 的值附加依赖属性。由于其默认样式将其设置为 {DynamicResource {x:Static SystemColors.ControlTextBrushKey} ,它会绑定(bind)到系统颜色。

    How does a TextBlock get its default font size and font family, if the client app doesn't provide any style, either programmatically or through xaml?



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

    更深入: SystemFonts.MessageFontFamilySystemFonts.MessageFontSize包裹内部 SystemParameters.NonClientMetrics依次从 WIN32 native SystemParametersInfo 中检索 http://msdn.microsoft.com/en-us/library/ms724947 .因此,WPF 与所有 Windows UI 内容(如主题、字体等)紧密集成。

    How does a Label get its default font size and font family?



    TextBlock 相同. Label源自 ContentControl这反过来又源自 Control . Control class 将自己添加为 TextElement.FontFamily 的所有者和 TextElement.FontSize具有相同默认值的属性。

    也可以看看:

    Property Value Inheritance

    更新 3

    您应该理解主要思想:值是继承的。这意味着它们可能从任何地方、任何控件继承。您可以准确地分辨出它是从哪个逻辑树结构继承而来的。你稍微改变一下 - 颜色也会改变。有人明确地设置了一个属性的值——所有的 child 都会继承这个值。因此,您的问题几乎没有实际意义。但从理解 WPF 的角度来看,它们仍然很有趣。

    覆盖默认值

    尽管您无法更改 SystemFonts 的值属性(它们是只读的),您不必这样做。要更改整个窗口的字体大小和系列,只需将所需的值分配给 TextElement Window 上的附加属性:
    <Window TextElement.FontSize="20" TextElement.FontFamily="Century Gothic">
    ..
    </Window>

    并且所有未显式覆盖继承的控件都将接收设置。对于那些确实覆盖的人 - 如果他们对值进行了硬编码,您将不得不覆盖他们的默认样式,甚至将它们丢弃。

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

    关于wpf - 如何在 WPF 应用程序中设置 TextBlock 和标签的默认颜色、字体系列和字体大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479259/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com