Nano Hash - криптовалюты, майнинг, программирование

Как установить цвет по умолчанию, семейство шрифтов и размер шрифта для TextBlock и Label в приложении WPF?

Изменить: я думаю, вопрос был сформулирован не очень четко. На самом деле он состоит из 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"/>

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

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

Вы сможете изменить цвет «переднего плана» для TextBlocks внутри 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>



Ответы:


1

Насколько я помню, в большинстве случаев такие классы, как TextBlock, TextBox и многие другие, берут цвет текста из свойства TextElement.Foreground. Значение свойства наследуется по всему визуальному дереву, т. е. вы можете установить его для корневого элемента, и большая часть текста изменит свой цвет. Например:

<Grid TextElement.Foreground="Red">
  <TextBlock Text="test"/>
</Grid>

На самом деле то же самое верно даже для меток: сеттер в их стиле по умолчанию просто устанавливает TextElement.Foreground в один из системных цветов.

Однако это верно только для состояния элементов управления по умолчанию. Измененные состояния, такие как выделение, не наследуются, а берутся из системных цветов, как писала Рэйчел.

ОБНОВЛЕНИЕ

То же самое верно для FontSize и FontFamily. Это свойства класса TextElement, к которым привязано использование свойства. Они наследуют свои ценности. Как только вы установите значение элемента визуального дерева, все его дочерние элементы получат такое же значение. Если они не переопределяют его явным назначением свойства, стилем и т.д.

Опять же, размер шрифта цвета текста и семейство шрифтов определяются значениями присоединенных свойств зависимостей TextElement.Foreground, TextElement.FontSize и TextElement.FontFamily для конкретного визуального элемента.

Некоторые элементы управления, такие как Label, явно устанавливают свои Foreground на какую-либо кисть. Бывает так, что кисть одна из SystemColors. Но это не обязательно должно быть верно для всех элементов управления. Другие (TextBlock, TextBox и т. д.) не переопределяют значение свойства и просто используют некоторые настройки по умолчанию, оцениваемые при запуске. То же самое происходит с FontSize и FontFamily. Вам не нужно устанавливать их где бы то ни было, чтобы они работали. Вот как работает WPF.

Предположительно, значения зависят от системной темы. Я считаю, что они оцениваются во время запуска приложения. Возможно, они настраиваются.

ОБНОВЛЕНИЕ 2

Ответы на ваши новые вопросы:

Как TextBlock получает свой цвет по умолчанию, если клиентское приложение не предоставляет никакого стиля ни программно, ни через xaml?

Он берет его из унаследованного значения присоединенного свойства зависимостей TextElement.Foreground. По умолчанию он наследуется от корневого визуального элемента, которому, в свою очередь, просто присваивается значение свойства зависимости по умолчанию (Brushes.Black). см. также

Как Label получает свой цвет по умолчанию?

Он берет его из значения прикрепленного свойства зависимостей TextElement.Foreground. Поскольку его стиль по умолчанию устанавливает его на {DynamicResource {x:Static SystemColors.ControlTextBrushKey}, он привязывается к системному цвету.

Как TextBlock получает свой размер шрифта и семейство шрифтов по умолчанию, если клиентское приложение не предоставляет никакого стиля ни программно, ни через xaml?

То же, что и для его цвета текста. MSDN говорит, что значение размера шрифта по умолчанию равно SystemFonts.MessageFontSize зависит от настроек системы. Семейство шрифтов определяется аналогичным образом из SystemFonts.MessageFontFamily. Оба этих значения по умолчанию передаются конструктору FrameworkPropertyMetadata после регистрации свойства зависимости в статическом конструкторе TextElement.

Углубляясь: SystemFonts.MessageFontFamily и SystemFonts.MessageFontSize обертывают внутренние SystemParameters.NonClientMetrics, которые, в свою очередь, извлекаются из собственного SystemParametersInfo WIN32 http://msdn.microsoft.com/en-us/library/ms724947. Таким образом, WPF тесно интегрирован со всеми элементами пользовательского интерфейса Windows, такими как темы, шрифты и т. д.

Как метка получает размер шрифта по умолчанию и семейство шрифтов?

То же, что и для 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 и так далее).

25.12.2011
  • Пожалуйста, прочитайте вопрос, прежде чем публиковать ответ. Я не верю, что какой-либо ответ предоставил какую-либо новую информацию, кроме той, которая уже есть в исходном вопросе. Большое спасибо. 25.12.2011
  • Надеюсь, мой комментарий не был грубым; если это так, то мне жаль. 25.12.2011
  • @mobileTofu В настоящее время я не понимаю, в чем ваш вопрос. Хотите знать, почему метки ведут себя не так, как текстовые блоки? Хотите знать, как определяются цвета по умолчанию и другие настройки? Почему вас не устраивают мои ответы или ответы Рэйчел? 25.12.2011
  • @mobileTofu Пожалуйста, смотрите мое ОБНОВЛЕНИЕ 2 для ответов на ваши перефразированные вопросы. 25.12.2011
  • Извините за путаницу. Я предполагаю, что я не ясно изложил свои вопросы, которые я обновил (снова), наряду с попыткой ответить на них самостоятельно. Вы сказали, что вам не нужно устанавливать их где угодно, чтобы они работали и предположительно зависели от системной темы, я думаю, именно в этом моя головоломка. Я хотел бы узнать, как system или framework WPF определяют эти значения по умолчанию, а не о том, как клиентское приложение предоставляет свои собственные стили для TextBlock или Контроль этикетки; хотя эти два вопроса как-то связаны. Надеюсь, это имеет смысл. Спасибо! 25.12.2011
  • Спасибо за обновление №3. Я предполагаю, что мои вопросы также можно было бы перефразировать относительно того, что находится на вершине деревьев наследования для этих свойств (передний план/размер шрифта/семейство). 25.12.2011
  • @mobileTofu Пожалуйста, обратитесь к моим ответам на ваши вопросы № 3, 4, приведенным в ОБНОВЛЕНИИ 2. Это отвечает на них. Я также добавил дополнительные сведения о том, как настройки свойств WPF по умолчанию сопоставляются с функциями WIN32 API («Углубление»). Проверьте, если это то, что вы хотите. 25.12.2011
  • Спасибо за обновления. Похоже на то, что я ищу. Итак, как мне определить/изменить MessageFontFamily и MessageFontSize, чтобы я увидел, что TextBlock или Label унаследованы либо через xaml, графический интерфейс Windows, либо программно? 26.12.2011
  • Работает только TextElement.FontSize=xx. .FontFamily и .Foreground не работают. например ‹Window TextElement.FontSize=16 TextElement.FontFamily=Comic Sans TextElement.Foreground=Red› ... ‹/Window› 19.10.2018

  • 2

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

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

    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
    
    12.12.2011
  • Однако SystemsColors, похоже, не влияет на TextBlocks. 12.12.2011
  • @mobileTofu Вы, должно быть, делаете это неправильно. Рэйчел права, если вы поместите ее образец кисти на ResourceDictionary, это переопределит системные настройки. Попробуйте использовать ControlTextBrushKey вместо HighlightBrushKey, чтобы усилить эффект. Кроме того, попробуйте поместить кисть на элемент логического дерева более высокого уровня, чем элементы управления, на которые вы хотите воздействовать. Ресурсы Label не повлияют на Label, только на его дочерние элементы. 25.12.2011
  • Ресурсы встроенного стиля @Pavel Gatilov для метки действительно влияют на метку. Пожалуйста, смотрите мое редактирование выше. Спасибо. 25.12.2011

  • 3

    В соответствии с этим: 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.стильшрифта(v=VS.95).aspx для стиля, в котором говорится:

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

    30.12.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..