Переопределить тему кисти Windows 10 UWP

Я пытаюсь переопределить некоторые цвета стиля в Windows 10, но я не могу заставить его работать.

Мое приложение app.xaml выглядит так:

        <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources.xaml"/>
        </ResourceDictionary.MergedDictionaries>
        <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Default" Source="Theme.xaml"/>
        </ResourceDictionary.ThemeDictionaries>
    </ResourceDictionary>
</Application.Resources>

И мой Theme.xaml выглядит так

<ResourceDictionary
x:Key="Default"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<SolidColorBrush x:Key="ListBoxBackgroundThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ListBoxFocusBackgroundThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ListBoxItemPressedBackgroundThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ListBoxItemSelectedForegroundThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ListBoxItemSelectedBackgroundThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="FocusVisualBlackStrokeThemeBrush" Color="Transparent" />
<SolidColorBrush x:Key="ScrollBarButtonForegroundThemeBrush" Color="Red" />
<SolidColorBrush x:Key="ScrollBarPanningBackgroundThemeBrush" Color="Red" />
<SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="White"/>

<SolidColorBrush x:Key="SearchBoxHitHighlightSelectedForegroundThemeBrush" Color="Red"/>
<SolidColorBrush x:Key="SearchBoxHitHighlightForegroundThemeBrush" Color="Pink"/>

Однако он не работает, он нигде не отменяет стиль.

Ответ 1

Стили, которые вы устанавливаете, предназначены для приложений Windows 8. Стили, используемые универсальными приложениями Windows, значительно упрощены.

Самый простой способ найти их - добавить свой ListBox на страницу, щелкнуть правой кнопкой мыши по нему в дизайнере и выбрать "Редактировать шаблон"... Создайте копию шаблона и посмотрите на используемые имена.

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

Например, ListBox использует следующие кисти для своего Foreground, Background и BorderBrush:

  • SystemControlForegroundBaseHighBrush
  • SystemControlBackgroundChromeMediumLowBrush
  • SystemControlForegroundBaseHighBrush

Ответ 2

Чтобы добавить ответ Роба, для тех, кто ищет более широкий отклик в приложении, он помог мне найти полные темы по умолчанию, которые доступны в \(Program Files)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\<SDK version>\Generic folder установки Windows SDK, в themeresources.xaml.

В этом есть ResourceDictionary для Default, HighContrast и Light. Клавиша по умолчанию обрабатывает тему Dark в UWP, так как это то, что будет по умолчанию, если не найден ни один "Dark" ResourceDictionary по умолчанию.

Темы Default и Light имеют почти 1000 цветов, специфичных для управления, или более общие цвета "SystemControlForeground...", такие как Rob, но в UWP они в основном основаны на следующих 25 цветовых категориях

  • 24 системных цвета
  • SystemAccentColor, определяемый пользователем общий цвет, который UWP-документы имеют целую страницу в разделе "Дизайн и интерфейс" > "Стиль" > "Цвет"
    • Там 6 более светлых и темных оттенков выше (SystemAccentColorLight1, ...Dark1 и т.д.), но они не используются в словарях ресурсов по умолчанию. Однако .6,.8 и .9 непрозрачности этого цвета используются несколько раз, используются только временные непрозрачности.

Затем есть еще 300 категорий цветов из Windows 8.1, которые остаются в списке, которые вручную выбирают определенный цвет, в пределах которого вы можете видеть здесь

Единственное исключение из вышеизложенного заключается в том, что стиль InkToolBar почти исключительно получается из цветов High Contrast.

Тема с высоким контрастом, сильно тянет из 8 дополнительных систем. [blank] Цвета, которые, подобно SystemAccentColor, являются значениями всей ОС. Они определяются шаблонами и/или пользователем, если они выбрали тему с высоким контрастом, которая является опцией Windows 10 в настройках персонализации. Высокая контрастность также является функцией доступности, поэтому я думаю, что я избегу переопределять этот ResourceDictionary, независимо от того, брендинг приложения.

Но эффективно, переопределяя цвета SystemAccentColor и 24 System [blank] в структуре XAML, вы можете последовательно изменять сотню определенных цветовых решений в приложении.