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

2024-01-18

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

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

顺便说一句,问题不在于如何change或定义颜色/字体大小/字体系列的样式TextBlock or a Label,尽管它们在某种程度上是相关的。我想我已经知道#2的答案了,那就是Label它的颜色来自SystemColors.ControlTextBrushKey http://msdn.microsoft.com/en-us/library/system.windows.systemcolors.controltextbrushkey.aspx并通过覆盖ConrolTextBrushKey像这样:

<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>

您将能够“全局”更改颜色Labels。经过一番研究,我想我也找到了#1的答案:ATextBlock从其包含的颜色继承其前景色Window,默认情况下获取其Foreground颜色来自SystemColors.WindowTextBrushKey http://msdn.microsoft.com/en-us/library/system.windows.systemcolors.windowtextbrushkey.aspx。通过为 WindowTextBrush 定义颜色,如下所示:

<Window.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}" 
                     Color="Yellow"/>
</Window.Resources>

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

问题#3和#4对我来说仍然是个谜,但我假设它们与系统字体 http://msdn.microsoft.com/en-us/library/system.windows.systemfonts.aspx.

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

以下是原帖:


如果你研究一下风格Label在Windows自带的主题(例如“aero.normalcolor.xaml”)中,您可以找到

<Setter Property="Foreground" 
        Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>

它设置了 a 的颜色Label。但没有一个地方可以FontSize属性是在样式中指定的,我认为这与系统字体 http://msdn.microsoft.com/en-us/library/system.windows.systemfonts.aspx. For 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>

哪里有一个Label or a TextBlock如果应用程序未设置任何值,则从中获取其颜色和字体大小/系列的值,WPF 中的这些挂钩在哪里?

Edit:

这是一次尝试设置的试驾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财产。该属性值在整个可视化树中继承,即您可以在根元素上设置它并让大部分文本更改其颜色。例如:

<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等等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 给图像着色[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试着色System Windows Controls Image 该图像包含透明区域 我只是想用颜色给非透明区域着色 例如 图
  • 非托管 C++ 中的默认打印机

    我正在寻找一种使用非托管 C 查找 Windows 默认打印机名称的方法 找到了大量 NET 示例 但非托管没有成功 谢谢 以下是如何获取当前打印机和默认打印机的列表 如果有一台设置为默认打印机 另请注意 如果用户没有打印机或未将打印机名称
  • Windows 操作系统中 ST_INO(os.stat() 输出)的含义

    谁能告诉我这个值的含义是什么st ino是跑步时os stat 在 Windows 上 Python 3 5 3 在早期的 Python 版本中 它包含虚拟值 但最近发生了变化 我找不到它是如何计算 生成的 我怀疑它因文件系统 NTFS F
  • WPF控件默认大小

    为 wpf 应用程序定义自定义资源主题时 我可以设置宽度 高度等 如何找到这些属性的默认值 即框架中提供的控件中使用的值 WPF 控件通常不包含任何类型的默认大小 WPF 的主要功能点之一是 除非您指定大小 否则所有内容都会动态调整大小 如
  • 在 ASP.NET 中动态设置主题

    我有一个连接到不同域的应用程序 我没有复制和修改每个应用程序 而是在硬盘驱动器上使用相同的物理位置 但在 IIS 上使用单独的应用程序池和网站 基本上我想根据主机名更改主题 IE 用户访问 websome com 获取 websome 主题
  • WPF 创建同级窗口并关闭当前窗口

    我需要的是我的窗口类中的这样一个事件处理程序 void someEventHandler object sender RoutedEventArgs e MyNewWindow mnw new MyNewWindow mnw Owner W
  • 获取自动热键中的可用屏幕区域

    我正在尝试编写一些简单的 AutoHotkey 脚本来移动窗口 但在获取正确的屏幕尺寸值时遇到问题 我试图获取屏幕上可用区域的大小 通常是全屏分辨率减去任务栏 也许还有任何其他停靠窗口 如 Vista 中的侧边栏 我发现的获取屏幕宽度的方法
  • 阻止 WPF 文本框增长

    我花了两个小时研究如何避免在输入长文本时我的 WPF TextBox 控件变长 但我无法做到这一点 即使我读过一些关于它的答案 如下所示 停止 wpf textbox from grow with text https stackoverf
  • 如何迭代所有注册表项?

    我正在尝试迭代所有注册表项以查找 包含 并删除 jre1 5 0 14 值 有办法做到吗 下面的代码只是在特定键下找到jre1 5 0 14 我确实想迭代所有的键 顺便说一句 if 子句获取是否等于 jre1 5 0 14 但如果它包含 j
  • 在 Windows 中使用 PHP 创建受密码保护的 Zip 文件

    我正在 PHP 中创建给定文件的 zip 文件 下面是函数 function create zip file file name zip new ZipArchive zip name file name zip Zip name zip
  • 生成尽可能最快的可执行文件

    我有一个非常大的程序 我一直在 Visual Studio 下编译 v6 然后迁移到 2008 我需要可执行文件尽可能快地运行 该程序大部分时间都花在处理各种大小的整数上 并且执行很少的 IO 显然 我会选择最大优化 但似乎可以做很多不属于
  • 将 value 转换为 bool 的魔法

    今天我意识到将值转换为 bool 是一种魔法 int value 0x100 unsigned char uc static cast
  • TRACKER:错误TRK0005:无法找到:“CL.exe”。该系统找不到指定的文件

    我尝试在 Windows 8 上的 Node js 项目中执行以下命令 npm 安装 电子邮件受保护 cdn cgi l email protection 但我收到一个错误 我不知道如何处理 TRACKER 错误TRK0005 无法找到 C
  • WPF根据数据类型设置样式?

    问题就在这里 我将 TreeView 与几种不同类型的对象绑定 每个对象都是一个节点 有些对象有一个名为 IsNodeExpanded 的属性 当然 有些对象则没有 这是我的风格 现在 问题是当绑定不具有此属性的项目时 我们在输出中收到此错
  • 如何处理来自单独线程的窗口消息?

    我希望启动一个单独的线程来处理窗口消息 通过阻塞 GetMessage 循环 但之后仍然在初始线程中创建窗口 在单独的线程中 一旦启动 我就会调用PeekMessage使用 PM NOREMOVE 确保消息队列存在 有必要吗 然后 Atta
  • npm package.json bin 无法在 Windows 上运行

    我正在尝试通过 package json 启动我的 cli 工具bin财产 我有以下内容 name mycli bin bin mycli 当我在包路径中打开 cmd 并输入 mycli 时 它表示该命令无法识别 我应该运行 npm 命令吗
  • 在 Vista 上调用 RPC 时出现“不支持操作”

    我的应用程序使用 Microsoft RPC 进行进程间通信 当两个进程在同一台机器上运行并且一个进程尝试调用声明为 IDL 表示法 的方法时 error status t rpcMethod in pipe byte parameter
  • 主从视图中聚合详细信息值

    我在一些自定义实体中有主从关系 假设我有以下结构 class Master INotifyPropertyChanged public int Id get set property changed implementation publi
  • 当 AutoGenerateColumns = True 时如何重命名 DataGrid 列?

    我有一个简单的数据结构类 public class Client public String name set get public String claim number set get 我正在将其喂入DataGrid this data
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re

随机推荐