如何覆盖 UWP 应用程序中的用户重音颜色

How to override user accent color in UWP app

我使用 Fluent XAML Theme Editor 应用程序为我的应用程序生成主题资源。

我的深色配色方案是 black/grey 带有橙色调。

当我在 Windows 10 设置中将强调色设置为绿色时(见下图),这种强调色会出现在某些地方。

由于绿色和橙色不太搭,这看起来很糟糕。我怎样才能确保这不会发生?

关于 SO 的其他类似问题的答案对我不起作用(请不要标记为重复)。

这就是我所做的。

在资源词典中,我为“深色”主题定义了橙色调。这是由 Fluent XAML 主题编辑器生成的(强调和覆盖都是橙色阴影):

<Windows10version1809:ColorPaletteResources Accent="#FFCC4D11"...
<!-- Override system generated accent colors -->
<Color x:Key="SystemAccentColorDark1">#FFD4632D</Color>
<Color x:Key="SystemAccentColorDark2">#FFDC7949</Color>
<Color x:Key="SystemAccentColorDark3">#FFE58E66</Color>
<Color x:Key="SystemAccentColorLight1">#FFB93E0E</Color>
<Color x:Key="SystemAccentColorLight2">#FFA62F0A</Color>
<Color x:Key="SystemAccentColorLight3">#FF932107</Color>

我也按照其他地方的建议添加了这个:

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

但是,none 有效,并且 Windows 绿色设置无论如何都会通过。例如,强调按钮在鼠标悬停时显示为绿色。绿色也出现在鼠标悬停时的组合框和单选按钮中。

按钮定义如下:

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

这是没有悬停和有悬停的样子。你不需要成为平面设计师就知道这是一个糟糕的外观。我希望在悬停时出现不同的橙色阴影。这些阴影在资源字典中定义为 SystemAccentColorDark1 - SystemAccentColorLight3,但由于某些原因它们似乎被忽略了。

我怎样才能始终如一地使用强调色?显然我不想重新设置每个控件的样式,我只希望始终使用资源字典中的颜色。

更新

即使在 Fluent XAML 主题编辑器应用程序本身中,系统强调色也会出现,尽管不是针对“强调按钮”,而是针对“复选框”和其他一些控件。查看图像,其中当鼠标悬停在复选框上时可以看到石灰突出显示。

根据 generic.xaml(在 C:\Program Files (x86)\Windows Kits\DesignTime\CommonConfiguration\Neutral\UAP.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>

解决此问题的一种方法是自定义控件模板。

我先从以下地方复制标准控件模板:

C:\Program Files (x86)\Windows Kits\DesignTime\CommonConfiguration\Neutral\UAP.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 没有人愿意参与其中。这绝对不是我的问题,这发生在 MS 的官方 Fluent XAML Editor 应用程序中。

找到问题了。

在我的 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 并删除页面资源时,强调色的奇怪问题就消失了。

   <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
                    <ResourceDictionary Source="ThemeDictionary.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
    </Application.Resources>

我现在遇到 ContentDialog 的问题,但那是不同的 post。这个资源合并似乎有些不对...