Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ресурсы темы в XAML — это набор ресурсов, которые применяют разные значения в зависимости от того, какая системная тема активна. Существует 3 темы, поддерживаемые платформой XAML: Light, Dark и HighContrast.
Предварительные требования: В этом разделе предполагается, что вы прочли материалы ResourceDictionary и ссылки на ресурсы XAML.
Ресурсы темы v. статические ресурсы
Существует два расширения разметки XAML, которые могут ссылаться на ресурс XAML из существующего словаря ресурсов XAML: расширение разметки {StaticResource} и расширение разметки {ThemeResource}.
Оценка расширения разметки {ThemeResource} производится при загрузке приложения и каждом последующем изменении темы во время выполнения. Обычно это результат изменения параметров устройства или программного изменения в приложении, которое изменяет текущую тему.
Напротив, расширение разметки {StaticResource} вычисляется только при первой загрузке XAML приложением. Он не обновляется. Он аналогичен поиску и замене в XAML фактическим значением времени выполнения в момент запуска приложения.
Ресурсы темы в структуре словаря ресурсов
Каждый ресурс темы является частью XAML файла themeresources.xaml. В целях разработки themeresources.xaml доступен в папке \(Program Files)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\<SDK version>\Generic из установки пакета SDK для Windows. Словари ресурсов в themeresources.xaml также воспроизводятся в generic.xaml в том же каталоге.
Windows Runtime не использует эти физические файлы для поиска во время выполнения. Именно поэтому они находятся в папке DesignTime, и по умолчанию они не копируются в приложения. Вместо этого эти словари ресурсов находятся в памяти, будучи частью Windows Runtime, а ссылки на ресурсы XAML вашего приложения на ресурсы темы (или системные ресурсы) разрешаются во время работы.
Рекомендации по ресурсам для пользовательских тем
Следуйте этим рекомендациям при определении и использовании собственных ресурсов пользовательской темы:
Укажите словари тем для "Light" и "Dark" в дополнение к словарю HighContrast. Хотя вы можете создать ResourceDictionary с ключом "Default", лучше явно указать и вместо этого использовать «Light», «Dark» и «HighContrast».
Используйте расширение разметки {ThemeResource} в: стилях, сеттерах, шаблонах элементов управления, установках свойств и анимациях.
Не используйте расширение разметки {ThemeResource} в определениях ресурсов внутри themeDictionaries. Вместо этого используйте расширение разметки {StaticResource} .
ИСКЛЮЧЕНИЕ. Расширение разметки {ThemeResource} можно использовать для ссылки на ресурсы, которые не зависят от темы приложения в ThemeDictionaries. Примерами этих ресурсов являются ресурсы цвета акцента, такие как
SystemAccentColor, или системные цветовые ресурсы, обычно начинающиеся на "SystemColor", какSystemColorButtonFaceColor.
Caution
Если вы не следуйте этим рекомендациям, в приложении может появиться непредвиденное поведение, связанное с темами. Дополнительные сведения см. в разделе "Устранение неполадок с ресурсами темы ".
Цветовая рампа XAML и кисти, зависящие от темы
Объединенный набор цветов для тем "Свет", "Темный" и "HighContrast" составляют цветовую рампу Windows в XAML. Следует ли изменить системные темы или применить тему к собственным элементам XAML, важно понять, как структурированы цветовые ресурсы.
Дополнительные сведения о применении цвета в Windows app см. в разделе Color в приложениях Windows.
Цвета светлой и темной темы
Платформа XAML предоставляет набор именованных ресурсов Color с значениями, адаптированными для тем "Свет" и "Темная". Для WinUI ресурсы темы определяются в файле Xaml общих ресурсов темы. Имена цветов очень точно описывают их предполагаемое использование, и для каждого ресурса Color существует соответствующий SolidColorBrush.
Подсказка
Визуальный обзор этих цветов см. в приложении коллекции WinUI 3: Colors
Приложение Галерея WinUI 3 включает интерактивные примеры большинства элементов управления WinUI, функций и возможностей. Получите приложение из магазина Microsoft Store или получите исходный код в GitHub
Цвета темы контрастности системы Windows
Помимо набора ресурсов, предоставляемых платформой XAML, существует набор значений цвета, производных от системной палитры Windows. Эти цвета не относятся к приложениям Windows Runtime или Windows. Однако многие из ресурсов кисти XAML используют эти цвета, если система работает (и приложение работает) с помощью темы HighContrast. Платформа XAML предоставляет эти системные цвета в качестве ключевых ресурсов. Ключи соответствуют формату именования: SystemColor[name]Color
Дополнительные сведения о поддержке тем контрастности см. в разделе "Темы контрастности".
Цвет системного акцента
Помимо системных цветов темы контрастности, системный акцентный цвет предоставляется как специальный цветовой ресурс с ключом SystemAccentColor. Во время выполнения этот ресурс получает цвет, указанный пользователем в качестве цвета акцента в параметрах персонализации Windows.
Замечание
Хотя можно переопределить системные цветовые ресурсы, рекомендуется уважать выбор цвета пользователя, особенно для параметров контрастной темы.
Кисти, зависящие от темы
Ресурсы цвета, отображаемые в предыдущих разделах, используются для задания свойства Color ресурсов SolidColorBrush в словарях ресурсов системной темы. Ресурсы кисти используются для применения цвета к элементам XAML.
Давайте рассмотрим, как значение цвета для этой кисти определяется во время выполнения. В словарях ресурсов Light и Dark этот элемент оформления определяется следующим образом:
<SolidColorBrush x:Key="TextFillColorPrimaryBrush" Color="{StaticResource TextFillColorPrimary}"/>
В словаре ресурсов "HighContrast" эта кисть определяется следующим образом:
<SolidColorBrush x:Key="TextFillColorPrimaryBrush" Color="{ThemeResource SystemColorWindowTextColor}"/>
Если эта кисть применяется к элементу XAML, его цвет определяется во время выполнения текущей темой, как показано в этой таблице.
| Тема | Ресурс цвета | Значение среды выполнения |
|---|---|---|
| Light | TextFillColorPrimary | #E4000000 |
| Темный | TextFillColorPrimary | #FFFFFFFF |
| HighContrast | SystemColorWindowTextColor (цвет текста оконной системы) | Цвет, указанный в параметрах текста. |
Шкала типов XAML
Файл themeresources.xaml определяет несколько ресурсов, определяющих стиль , который можно применить к текстовым контейнерам в пользовательском интерфейсе, в частности для TextBlock или RichTextBlock. Эти стили не являются неявными по умолчанию. Они предоставляются для упрощения создания определений пользовательского интерфейса XAML, которые соответствуют пандусу типа Windows , документированному в рекомендациях по шрифтам.
Эти стили предназначены для текстовых атрибутов, которые необходимо применить ко всему текстовому контейнеру. Если вы хотите применить стили только к разделам текста, задайте атрибуты для текстовых элементов в контейнере, например в файле Run in TextBlock.Inlines или абзаце в RichTextBlock.Blocks.
Стили выглядят следующим образом при применении к TextBlock:
| Стиль | Weight | Size |
|---|---|---|
| Заголовок | Регулярный | 12 |
| Тело | Регулярный | 14 |
| Тело сильное | Полуболд | 14 |
| Основной Большой | Регулярный | 18 |
| Тело большое и сильное | Полуболд | 18 |
| Подзаголовок | Полуболд | 20 |
| Заголовок | Полуболд | 28 |
| Большой заголовок | Полуболд | 40 |
| Display | Полуболд | 68 |
<TextBlock Text="Caption" Style="{StaticResource CaptionTextBlockStyle}"/>
<TextBlock Text="Body" Style="{StaticResource BodyTextBlockStyle}"/>
<TextBlock Text="Body Strong" Style="{StaticResource BodyStrongTextBlockStyle}"/>
<TextBlock Text="Body Large" Style="{StaticResource BodyLargeTextBlockStyle}"/>
<TextBlock Text="Subtitle" Style="{StaticResource SubtitleTextBlockStyle}"/>
<TextBlock Text="Title" Style="{StaticResource TitleTextBlockStyle}"/>
<TextBlock Text="Title Large" Style="{StaticResource TitleLargeTextBlockStyle}"/>
<TextBlock Text="Display" Style="{StaticResource DisplayTextBlockStyle}"/>
Инструкции по использованию пандуса типов Windows в приложении см. в разделе "Типография" в приложениях Windows.
Дополнительные сведения о стилях XAML см. в статье WinUI на GitHub:
- Заголовок TextBlockStyle
- Body TextBlockStyle
- Body Strong TextBlockStyle
- Body Large TextBlockStyle
- Body Large Strong TextBlockStyle
- Подзаголовок TextBlockStyle
- Заголовок TextBlockStyle
- Заголовок крупный стиль текстового блока
- Отображение TextBlockStyle
Подсказка
Визуальный обзор этих стилей см. в приложении коллекции WinUI 3: Typeography
BaseRichTextBlockStyle
TargetType: RichTextBlock
Предоставляет общие свойства для всех других стилей контейнеров RichTextBlock .
<!-- Usage -->
<RichTextBlock Style="{StaticResource BaseRichTextBlockStyle}">
<Paragraph>Rich text.</Paragraph>
</RichTextBlock>
<!-- Style definition -->
<Style x:Key="BaseRichTextBlockStyle" TargetType="RichTextBlock">
<Setter Property="FontFamily" Value="Segoe UI Variable"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="TextTrimming" Value="None"/>
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="LineStackingStrategy" Value="MaxHeight"/>
<Setter Property="TextLineBounds" Value="Full"/>
<Setter Property="OpticalMarginAlignment" Value="TrimSideBearings"/>
</Style>
BodyRichTextBlockStyle
<!-- Usage -->
<RichTextBlock Style="{StaticResource BodyRichTextBlockStyle}">
<Paragraph>Rich text.</Paragraph>
</RichTextBlock>
<!-- Style definition -->
<Style x:Key="BodyRichTextBlockStyle" TargetType="RichTextBlock" BasedOn="{StaticResource BaseRichTextBlockStyle}">
<Setter Property="FontWeight" Value="Normal"/>
</Style>
Примечание. Стили RichTextBlock не имеют всех стилевых решений оформления текста, которые есть у TextBlock, главным образом потому, что объектная модель документа на основе блоков для RichTextBlock упрощает применение атрибутов к отдельным текстовым элементам. Кроме того, при настройке TextBlock.Text с помощью свойства содержимого XAML создается ситуация, при которой отсутствует текстовый элемент для стилизации, поэтому вам придется стилизовать контейнер. Это не проблема для RichTextBlock , так как его текстовое содержимое всегда должно находиться в определенных текстовых элементах, таких как Абзац, где можно применять стили XAML для заголовка страницы, подзаголовки страницы и аналогичных определений текстового пандуса.
Разные именованные стили
Существует дополнительный набор определений стилей с ключами стиля, которые можно применить к стилю кнопки, отличного от типичного стиля по умолчанию.
СтильОбычнойКнопкиНазадНавигации
TargetType: Button
Этот стиль предоставляет полный шаблон для кнопки , которая может быть кнопкой назад навигации для приложения навигации. Размеры по умолчанию — 40 x 40 пикселей. Чтобы настроить стили, вы можете явно задать высоту, ширину, шрифтSize и другие свойства на кнопке или создать производный стиль с помощью BasedOn.
Вот Кнопка с ресурсом NavigationBackButtonNormalStyle, примененным к ней.
<Button Style="{StaticResource NavigationBackButtonNormalStyle}" />
Он будет выглядеть примерно так:
СтильМаленькойКнопкиНазад
TargetType: Button
Этот стиль предоставляет полный шаблон для кнопки , которая может быть кнопкой назад навигации для приложения навигации. Он похож на NavigationBackButtonNormalStyle, но его размеры составляют 30 x 30 пикселей.
Вот кнопка с примененным к ней ресурсом NavigationBackButtonSmallStyle.
<Button Style="{StaticResource NavigationBackButtonSmallStyle}" />
Устранение неполадок с ресурсами темы
Если вы не следуйте рекомендациям по использованию ресурсов темы, в приложении может появиться непредвиденное поведение, связанное с темами.
Например, при открытии всплывающего меню с светлой темой части вашего темного приложения также изменяются, как если бы они были в светлой теме. Или если перейти на страницу со светлой темой, а затем вернуться, исходная темная тематическая страница (или её части) теперь выглядит так, как будто она находится в светлой теме.
Как правило, эти типы проблем возникают при предоставлении темы по умолчанию и темы HighContrast для поддержки сценариев высокой контрастности, а затем используются темы Light и Dark в разных частях приложения.
Например, рассмотрим это определение словаря тем:
<!-- DO NOT USE. THIS XAML DEMONSTRATES AN ERROR. -->
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Default">
<SolidColorBrush x:Key="myBrush" Color="{ThemeResource ControlFillColorDefault}"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<SolidColorBrush x:Key="myBrush" Color="{ThemeResource SystemColorButtonFaceColor}"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
Интуитивно это выглядит правильно. Вы хотите изменить цвет, который указывает на myBrush в режиме высокой контрастности, а при обычной контрастности вы полагаетесь на расширение разметки {ThemeResource}, чтобы убедиться, что myBrush соответствует правильному цвету для вашей темы. Если ваше приложение никогда не устанавливает FrameworkElement.RequestedTheme для элементов в его визуальном дереве, это обычно будет работать должным образом. Однако в вашем приложении начинаются проблемы, как только вы начнете изменять тему различных частей визуального дерева.
Проблема возникает, потому что кисти являются ресурсами общего пользования, в отличие от большинства других типов XAML. Если у вас есть 2 элемента в поддеревьях XAML с различными темами, ссылающимися на один ресурс кисти, то при обходе фреймворком каждого поддерева для обновления выражений расширения разметки {ThemeResource} изменения в общем ресурсе кисти отражаются в другом поддереве, что не является вашим предполагаемым результатом.
Чтобы устранить эту проблему, замените словарь по умолчанию отдельными словарями тем для тем "Light" и "Dark" в дополнение к HighContrast:
<!-- DO NOT USE. THIS XAML DEMONSTRATES AN ERROR. -->
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<SolidColorBrush x:Key="myBrush" Color="{ThemeResource ControlFillColorDefault}"/>
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<SolidColorBrush x:Key="myBrush" Color="{ThemeResource ControlFillColorDefault}"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<SolidColorBrush x:Key="myBrush" Color="{ThemeResource SystemColorButtonFaceColor}"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
Однако проблемы по-прежнему возникают, если какие-либо из этих ресурсов встраиваются в унаследованные свойства, такие как Foreground. Шаблон пользовательского элемента управления может указать цвет переднего плана элемента с помощью расширения разметки {ThemeResource}, но когда платформа распространяет унаследованное значение на дочерние элементы, она предоставляет прямую ссылку на ресурс, который был разрешен выражением расширения разметки {ThemeResource}. Это приводит к проблемам, когда фреймворк обрабатывает изменения темы оформления, проходя визуальное дерево элемента управления. Он повторно оценивает выражение расширения разметки {ThemeResource}, чтобы получить новый ресурс кисти, но пока не распространяет эту ссылку на дочерние элементы элемента управления; это происходит позже, например во время следующей меры.
В результате после обхода визуального дерева элемента управления в ответ на изменение темы платформа обходит дочерние элементы и обновляет все выражения расширения разметки {ThemeResource}, установленные на них, или объекты, заданные в их свойствах. В этом месте возникает проблема; Фреймворк обрабатывает ресурс кисти, и так как он задает его цвет с помощью расширения разметки {ThemeResource}, он переоценивается.
На этом этапе, как представляется, фреймворк исказил словарь тем, поскольку теперь в нем есть ресурс из одного словаря, для которого цвет установлен из другого словаря.
Чтобы устранить эту проблему, используйте расширение разметки {StaticResource} вместо расширения разметки {ThemeResource}. При применении рекомендаций словари тем выглядят следующим образом:
<ResourceDictionary>
<ResourceDictionary.ThemeDictionaries>
<ResourceDictionary x:Key="Light">
<SolidColorBrush x:Key="myBrush" Color="{StaticResource ControlFillColorDefault}"/>
</ResourceDictionary>
<ResourceDictionary x:Key="Dark">
<SolidColorBrush x:Key="myBrush" Color="{StaticResource ControlFillColorDefault}"/>
</ResourceDictionary>
<ResourceDictionary x:Key="HighContrast">
<SolidColorBrush x:Key="myBrush" Color="{ThemeResource SystemColorButtonFaceColor}"/>
</ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>
</ResourceDictionary>
Обратите внимание, что расширение разметки {ThemeResource} по-прежнему используется в словаре HighContrast вместо расширения разметки {StaticResource}. Эта ситуация относится к исключению, приведенному ранее в рекомендациях. Большинство значений кистей, используемых для темы HighContrast, используют варианты цвета, которые глобально управляются системой, но предоставляются XAML в качестве специально именованного ресурса (те, которые имеют префикс SystemColor в имени). Система позволяет пользователю задать определенные цвета, которые следует использовать для параметров контрастной темы при помощи Центра специальных возможностей. Эти варианты цвета применяются к специально именованным ресурсам. Фреймворк XAML использует событие изменения темы, чтобы также выполнить обновление этих кистей, когда обнаруживаются изменения на уровне системы. Поэтому здесь используется расширение разметки {ThemeResource}.
Windows developer