mob*_*ofu 5 windows wpf label themes textblock
编辑:我想这个问题没有说清楚.它实际上由4个独立的组成:
TextBlock
如果客户端应用程序不以编程方式或通过xaml提供任何样式,如何获取其默认颜色? Label
获得其默认颜色?TextBlock
如果客户端应用程序不以编程方式或通过xaml提供任何样式,如何获取其默认字体大小和字体系列?Label
获得其默认字体大小和字体系列?顺便说一下,问题不在于如何更改或定义a TextBlock
或a 的颜色/字体大小/字体系列的样式Label
,尽管它们在某种程度上是相关的.我想我已经知道了#2的答案,这是Label
从SystemColors.ControlTextBrushKey得到它的颜色,并通过覆盖ConrolTextBrushKey
如下:
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>
Run Code Online (Sandbox Code Playgroud)
你可以"全局"改变Label
s的颜色.经过一番研究,我想我也找到了#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有关.
希望这是有道理的.我真的很想知道答案,因为他们一直在困扰我.非常感谢!
以下是原帖:
如果您查看Label
Windows附带的主题中的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)
至于我记得,在大多数情况下类,比如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.FontSize
和TextElement.FontFamily
一个特定的视觉元件上附着的依赖特性.
一些控件,比如Label
明确设置Foreground
一些画笔.它发生在刷子是其中之一SystemColors
.但并非所有控件都适用.其他(TextBlock
,TextBox
等)不会覆盖属性值,只使用启动时评估的一些默认设置.同样的事情发生在FontSize
和FontFamily
.您无需在任何地方设置它们以便它们工作.这就是WPF的工作原理.
据推测,这些值取决于系统主题.我相信他们会在应用启动期间进行评估.也许它们是可配置的.
更新2
您的新问题的答案:
如果客户端应用程序没有以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认颜色?
它从TextElement.Foreground
附加的依赖属性的继承值中获取它.默认情况下,它从根视觉元素继承,而视觉元素又简单地设置为依赖属性(Brushes.Black
)的默认值.也可以看看
Label如何获得其默认颜色?
它从TextElement.Foreground
附加的依赖属性的值中获取它.由于其默认样式将其设置为{DynamicResource {x:Static SystemColors.ControlTextBrushKey}
,因此它将绑定到系统颜色.
如果客户端应用程序不以编程方式或通过xaml提供任何样式,TextBlock如何获得其默认字体大小和字体系列?
与其文字颜色相同.MSDN表示,字体大小的默认值是SystemFonts.MessageFontSize,它取决于系统设置.字体系列的确定方式与SystemFonts.MessageFontFamily类似.FrameworkPropertyMetadata
在TextElement
静态构造函数中依赖属性注册时,这两个默认值都将传递给构造函数.
更深入:SystemFonts.MessageFontFamily
并SystemFonts.MessageFontSize
包装内部SystemParameters.NonClientMetrics
,然后从WIN32原生SystemParametersInfo
http://msdn.microsoft.com/en-us/library/ms724947检索.因此,WPF与所有Windows UI的东西紧密集成,如主题,字体等.
Label如何获得其默认字体大小和字体系列?
同样的TextBlock
.Label
衍生自ContentControl
哪来源于Control
.Control
类添加本身作为的所有者TextElement.FontFamily
和TextElement.FontSize
属性具有相同的默认值.
也可以看看:
更新3
您应该了解主要想法:值是继承的.这意味着它们可以从任何地方继承任何控制.您可以确切地确定它仅从某个逻辑树结构继承的是哪一个.你改变了一点 - 颜色改变了.有人明确设置属性的值 - 所有子节点都将继承该值.因此,你的问题几乎没有实际意义.但从WPF未定的角度来看,它们仍然很有趣.
覆盖默认值
虽然您无法更改SystemFonts
属性的值(它们是只读的),但您不必这样做.要更改整个窗口的字体大小和系列,只需将所需的值分配给TextElement
附加的属性Window
:
<Window TextElement.FontSize="20" TextElement.FontFamily="Century Gothic">
..
</Window>
Run Code Online (Sandbox Code Playgroud)
并且所有未显式覆盖继承的控件都将收到设置.对于那些覆盖的人 - 你必须覆盖他们的默认样式,如果他们对值进行硬编码,甚至会抛弃它们.
相同的方法适用于TextElement.Foreground
(Background
和等等).
默认颜色取自操作系统的设置。
您可以通过创建具有引用SystemColors画笔键的键的画笔来覆盖它们
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22979 次 |
最近记录: |