Насколько я помню, в большинстве случаев такие классы, как TextBlock
, TextBox
и многие другие, берут цвет текста из свойства TextElement.Foreground
. Значение свойства наследуется по всему визуальному дереву, то есть вы можете установить его для корневого элемента, и большая часть текста изменит свой цвет. Например:
<Grid TextElement.Foreground="Red">
<TextBlock Text="test"/>
</Grid>
Фактически, то же самое верно и для этикеток: установщик в их стиле по умолчанию просто устанавливает TextElement.Foreground
на один из системных цветов.
Однако это верно только для состояния элементов управления по умолчанию. Измененные состояния, такие как выделение, не наследуются, а отбираются из системных цветов, как написала Рэйчел.
UPDATE
То же самое верно для FontSize
и FontFamily
. Они являются свойствами класса TextElement
, к которым прикреплено использование свойства. Они наследуют свои ценности. Как только вы установите значение для элемента визуального дерева, все его дочерние элементы получат одинаковое значение. Если они не переопределяют это либо явным назначением свойства, либо стилем и т. Д.
Еще раз размер шрифта текста и семейство шрифтов регулируются значением TextElement.Foreground
, TextElement.FontSize
и TextElement.FontFamily
вложенных свойств зависимостей для конкретного визуального элемента.
Некоторые элементы управления, например Label
, явно устанавливают свои Foreground
для какой-либо кисти. Бывает так, что кисть одна из SystemColors
. Но это не должно быть правдой для всех элементов управления. Другие (TextBlock
, TextBox
и т. Д.) Не переопределяют значение свойства, а просто используют некоторые параметры по умолчанию, оцененные при запуске. То же самое происходит с FontSize
и FontFamily
. Вам не нужно устанавливать их где угодно, чтобы они работали . Вот как работает WPF.
Предположительно, значения зависят от системной темы. Я считаю, что они оцениваются во время запуска приложения. Возможно, они настраиваются.
ОБНОВЛЕНИЕ 2
Ответы на ваши новые вопросы:
Как TextBlock получает свой цвет по умолчанию, если клиентское приложение не предоставляет какого-либо стиля ни программно, ни через xaml?
Он берется из унаследованного значения TextElement.Foreground
присоединенного свойства зависимостей. По умолчанию он наследуется от корневого визуального элемента, который, в свою очередь, просто устанавливается в значение по умолчанию свойства зависимости (Brushes.Black
). См. Также
Как метка получает цвет по умолчанию?
Он берется из значения TextElement.Foreground
присоединенного свойства зависимостей. Так как его стиль по умолчанию устанавливает его на {DynamicResource {x:Static SystemColors.ControlTextBrushKey}
, он привязывается к системному цвету.
Как TextBlock получает свой размер шрифта и семейство шрифтов по умолчанию, если клиентское приложение не предоставляет какого-либо стиля, ни программно, ни через xaml?
Так же, как и для текста. 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, такими как темы, шрифты и т. д.
Как Label получает размер шрифта по умолчанию и семейство шрифтов?
Так же, как и для TextBlock
. Label
происходит от ContentControl
, что, в свою очередь, происходит от Control
. Класс Control
добавляет себя в качестве владельца свойств TextElement.FontFamily
и TextElement.FontSize
с теми же значениями по умолчанию.
Смотри также:
Значение свойства Наследование
ОБНОВЛЕНИЕ 3
Вы должны понять основную идею: значения наследуются.Это означает, что они могут быть унаследованы отовсюду, от любого контроля.Вы можете точно сказать, от какого он унаследован, только для определенной логической древовидной структуры.Вы немного меняете это - и цвета меняются.Кто-то явно устанавливает значение свойства - и все дети будут наследовать это значение.Поэтому ваши вопросы имеют мало практического смысла.Но они все еще интересны с точки зрения понимания WPF.
Переопределение значений по умолчанию
Хотя вы не можете изменить значения свойств SystemFonts
(они читаютсятолько), вам не нужно.Чтобы изменить размер шрифта и семейство для всего окна, просто присвойте нужные значения присоединенным свойствам TextElement
в Window
:
<Window TextElement.FontSize="20" TextElement.FontFamily="Century Gothic">
..
</Window>
, и все элементы управления, которые явно не переопределяют наследование, будутполучить настройки.Для тех, кто переопределяет - вам придется переопределить их стили по умолчанию или даже выбросить их, если они жестко закодируют значения.
Тот же подход работает для TextElement.Foreground
(и Background
и т. Д.).