如何覆盖 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。这个资源合并似乎有些不对...
我使用 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。这个资源合并似乎有些不对...