Как переопределить цвет акцента пользователя в приложении UWP - PullRequest
2 голосов
/ 21 июня 2020

Я использовал приложение Fluent XAML Theme Editor для создания ресурсов темы для моего приложения.

Моя темная цветовая схема - черный / серый с оранжевым акцентом.

Когда я установите зеленый цвет в настройках Windows 10 (см. изображение ниже), этот цвет акцента появляется в некоторых местах.

Windows Color Theme Settings

As green and orange don't go well together, this looks really bad. How can I ensure that this does not happen?

Other similar questions on SO have answers that do NOT work for me (please do not mark as duplicate).

This is what I have done.

In Resource Dictionary I have defined orange accents for my "Dark" theme. This was generated by Fluent XAML Theme Editor (both accent and overrides are shades of orange):


 # FFD4632D  # FFDC7949  # FFE58E66  # FFB93E0E  # FFA62F0A  # FF932107  

Я также добавил это, как предлагалось в другом месте на SO:

<SolidColorBrush x:Key="SystemControlHighlightAccentBrush" Color="#FFCC4D11" />

Однако ничего из этого не работает, и Windows Настройки зеленого цвета все равно проходят. Например, кнопка с акцентом становится зеленой при наведении курсора мыши. Зеленый также появляется в полях со списком и переключателях при наведении курсора мыши.

Кнопка определяется следующим образом:

  <Button Style="{StaticResource AccentButtonStyle}" Content="Start"/>

Вот как она выглядит без наведения и с наведением. Вам не нужно быть графическим дизайнером, чтобы знать, что это плохой вид. Я хочу, чтобы при наведении курсора отображался другой оттенок оранжевого. Эти оттенки определены в словаре ресурсов как SystemAccentColorDark1 - SystemAccentColorLight3, но они, кажется, по какой-то причине игнорируются.

Как я могу последовательно применять свои акцентные цвета? Очевидно, я не хочу изменять стиль каждого элемента управления, я просто хочу, чтобы цвета из словаря ресурсов использовались последовательно.

Accent button with and without mouse hover

UPDATE

System accent color is coming through even in Fluent XAML Theme Editor App itself, although not for the "Accent Button" but for "Check Box" and some other controls. See image where lime highlight is visible when mouse hovers over check box.

Цвет системного акцента в редакторе тем XAML Fluent

Ответы [ 4 ]

0 голосов
/ 29 августа 2020

Обнаружил проблему.

В моем app.xaml у меня было это для элементов управления WinUI:

 <Application>
    <Application.Resources>
        <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
    </Application.Resources>
</Application>

На каждой странице у меня была цветовая тема в качестве словаря ресурсов.

   <Page.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="ThemeDictionary.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
    </Page.Resources>

По какой-то причине это работает некорректно.

Когда я поместил и в app.xaml, и удалил ресурсы страницы, странные проблемы с акцентными цветами исчезли. 1014 * Теперь у меня проблемы с ContentDialog, но это другой пост SO. Что-то не так с этим объединением ресурсов кажется ...

0 голосов
/ 20 августа 2020

Один из способов исправить это - настроить шаблон элемента управления.

Сначала я копирую стандартный шаблон элемента управления из:

C: \ Program Files (x86) \ Windows Kits \ 10 \ DesignTime \ CommonConfiguration \ Neutral \ UAP \ 10.0.19041.0 \ Generic \ themeresources.xaml

в свой словарь ресурсов.

Затем я тщательно изменяю шаблон для устранения оскорбительных цветов. Примерно так:

                       <VisualState x:Name="PointerOver">
                            <VisualState.Setters>
                                <Setter Target="RootGrid.(RevealBrush.State)" Value="PointerOver" />
                                <Setter Target="RootGrid.Background" Value="Transparent" />
                                <Setter Target="ContentPresenter.BorderBrush" Value="{ThemeResource SystemBaseLowColor}" />
                                <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource SystemAccentColor}" />
                            </VisualState.Setters>

Это действительно утомительная и ненужная работа, я не уверен, почему никто из MS не прыгает на это. Это определенно проблема не только для меня, это происходит в официальном приложении Fluent XAML Editor от MS.

0 голосов
/ 20 августа 2020

Я обнаружил свойство UseSystemFocusVisuals , которое кажется здесь актуальным.

Согласно документации MS по умолчанию установлено значение false, но не

true, если элемент управления использует визуальные элементы фокуса, нарисованные системой; false, если элемент управления использует визуальные элементы фокуса, определенные в ControlTemplate. По умолчанию - false; см. примечания.

Если я смотрю в шаблоны элементов управления по умолчанию, это на самом деле установлено на true:

<x:Boolean x:Key="UseSystemFocusVisuals">True</x:Boolean>

Я пробовал установить для него значение false, но, похоже, он не работает любая разница:

<Setter Property="UseSystemFocusVisuals" Value="False" />
0 голосов
/ 21 июня 2020

Согласно generic.xamlC:\Program Files (x86)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\10.0.19041.0\Generic), AccentButtonStyle использует следующее для фона наведения:

AccentButtonBackgroundPointerOver

Это ресурс, использующий SystemControlForegroundAccentBrush, который, в свою очередь, использует SystemAccentColor. Это ресурс, который необходимо переопределить, чтобы избежать появления системного цвета акцента, например:

<Color x:Key="SystemAccentColor">#FFFF00</Color>

Если вы поместите этот ресурс в глобальное расположение (например, Application.xaml), он должен переопределить Цвет акцента повсюду.

Я до сих пор не понимаю, почему не применяется цвет акцента, созданный редактором Fluent Theme.

Я тестировал это на простом пустом приложении - MainPage.xaml :

<Grid>
   <Button Style="{StaticResource AccentButtonStyle}" />
</Grid>

И App.xaml:

<Application
    x:Class="App8.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App8">
    <Application.Resources>
        <Color x:Key="SystemAccentColor">#FF0000</Color>
    </Application.Resources>
</Application>
...