Изменить: я думаю, вопрос был сформулирован не очень четко. На самом деле он состоит из 4 отдельных:
- Как
TextBlock
получает свой цвет по умолчанию, если клиентское приложение не предоставляет никакого стиля ни программно, ни через xaml? - Как
Label
получает цвет по умолчанию? - Как
TextBlock
получает свой размер шрифта и семейство шрифтов по умолчанию, если клиентское приложение не предоставляет никакого стиля ни программно, ни через xaml? - Как
Label
получает размер шрифта по умолчанию и семейство шрифтов?
Кстати, вопросы не о том, как изменить или определить стили для цвета/размера шрифта/семейства шрифтов TextBlock
или Label
, хотя они каким-то образом связаны. Я думаю, что уже знал ответ для № 2, то есть Label
получает свой цвет от SystemColors.ControlTextBrushKey и переопределив ConrolTextBrushKey
следующим образом:
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Red"/>
Вы сможете «глобально» изменить цвет на Label
s. После некоторых исследований, я думаю, я также нашел ответ для № 1: TextBlock
наследует свой цвет переднего плана от содержащего его Window
, который по умолчанию получает свой цвет Foreground
от SystemColors.WindowTextBrushKey. Определив цвет для WindowTextBrush следующим образом:
<Window.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}"
Color="Yellow"/>
</Window.Resources>
Вы сможете изменить цвет «переднего плана» для TextBlock
s внутри Window
.
Вопросы № 3 и № 4 остаются для меня загадкой, но я предполагаю, что они связаны с Системные шрифты.
Надеюсь, это имеет смысл. Мне очень нравится знать ответы, поскольку они беспокоили меня какое-то время. Большое спасибо!
Ниже оригинальный пост:
Если вы посмотрите на стиль Label
в теме (например, "aero.normalcolor.xaml"), поставляемой с Windows, вы можете найти
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
Который устанавливает цвет для Label
. Но в стиле не указано свойство FontSize
, которое, как я предполагаю, как-то связано с Системные шрифты. Для 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
или 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>