Как установить цвет по умолчанию, семейство шрифтов и размер шрифта для TextBlock и Label в приложении WPF? - PullRequest
5 голосов
/ 12 декабря 2011

Редактировать: Я думаю, вопрос не был сформулирован очень четко На самом деле он состоит из 4 отдельных:

  1. Как TextBlock получает свой цвет по умолчанию, если клиентское приложение не предоставляет какого-либо стиля, ни программно, ни через xaml?
  2. Как Label получает цвет по умолчанию?
  3. Как TextBlock получает свой размер шрифта и семейство шрифтов по умолчанию, если клиентское приложение не предоставляет какого-либо стиля, ни программно, ни через xaml?
  4. Как Label получает размер шрифта по умолчанию и семейство шрифтов?

Кстати, вопросы не о том, как изменить или определить стили для цвета / размера шрифта / семейства шрифтов TextBlock или Label, хотя они как-то связаны. Я думаю, что я уже знал ответ для # 2, то есть Label получает свой цвет от SystemColors.ControlTextBrushKey и переопределяет ConrolTextBrushKey следующим образом:

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

Вы сможете "глобально" изменить цвет в течение Label с. После некоторого исследования, я думаю, я также найду ответ для # 1: TextBlock наследует свой цвет переднего плана от содержащего Window, который по умолчанию получает Foreground цвет от SystemColors.WindowTextBrushKey, Определив цвет для WindowTextBrush следующим образом:

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

Вы сможете изменить цвет "переднего плана" для TextBlock внутри Window.

Вопрос № 3 и № 4 остаются для меня загадкой, но я предполагаю, что они имеют отношение к SystemFonts .

Надеюсь, это имеет смысл. Мне действительно нравится знать ответы, поскольку они беспокоили меня некоторое время. Большое спасибо!

Ниже оригинальное сообщение:


Если вы посмотрите на стиль для Label в теме (например, «aero.normalcolor.xaml»), которая поставляется с Windows, вы можете найти

<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>

Откуда Label или 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>

Ответы [ 3 ]

7 голосов
/ 25 декабря 2011

Насколько я помню, в большинстве случаев такие классы, как 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.ForegroundBackground и т. Д.).

2 голосов
/ 12 декабря 2011

Цвета по умолчанию извлекаются из настроек операционной системы.

Вы можете перезаписать их, создав кисть с ключом, который ссылается на SystemColors ключ кисти

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
0 голосов
/ 30 декабря 2011

В соответствии с этим: http://msdn.microsoft.com/en-us/library/ms788718.aspx

По умолчанию WPF использует шрифт GlobalUserInterface.composite в каталоге Windows \ Fonts.

И соответственнона это: http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock.fontsize(v=vs.95).aspx

Неотрицательное значение, которое определяет размер шрифта, измеренный в пикселях.По умолчанию используется значение 11.

Кроме того, вы можете найти множество других значений по умолчанию, хранящихся в разных местах на сайте MSDN: http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock.fontstyle(v=VS.95).aspx для стиля, который гласит:

Запрошенный стиль шрифта, который представляет собой FontStyle, который получается из одного из значений свойства FontStyles.По умолчанию установлено значение Normal.

...