覆盖主题画刷 Windows 10 UWP

11

我想要在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"/>

然而它不起作用,它无法覆盖任何地方的样式。


"Default"键与暗色主题相关,请尝试添加一个带有“Light”键的新行。同时要注意StaticResource和ThemeResource之间的区别。 - Bruno Lemos
2个回答

7
您设置的样式是针对Windows 8应用程序的。通用Windows应用程序使用的样式大大简化。
找到它们最简单的方法是将您的ListBox添加到页面中,在设计器中右键单击它,然后选择“编辑模板”...创建一个模板副本并查看使用的名称。
现在所有控件尽可能使用相同的画笔,而不是具有特定于控件的画笔。
例如,ListBox使用以下画笔来设置其前景、背景和边框笔刷:
- SystemControlForegroundBaseHighBrush - SystemControlBackgroundChromeMediumLowBrush - SystemControlForegroundBaseHighBrush

实际上这就是我所做的。被覆盖的SearchBox样式为:http://pastebin.com/39aG751n,但它不能改变一些颜色,例如SearchBoxHitHighlightForegroundThemeBrush和SearchBoxHitHighlightSelectedForegroundThemeBrush。 - robertk
1
这在 Windows 10 IoT / UWP 的 RTM 版本中对我有效。例如,要覆盖令人恼火的粉色默认强调画刷并放置您的品牌颜色: <SolidColorBrush x:Key="SystemControlForegroundAccentBrush" Color="{StaticResource YourBrandColorResourceKey}" /> - Tony Wall

4
为了补充Rob的回答,对于那些寻找更广泛的应用程序级响应的人来说,帮助我找到了完整的默认主题,它们位于Windows SDK安装的\(Program Files)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\<SDK version>\Generic文件夹中的themeresources.xaml中。
其中包含了Default、HighContrast和Light的ResourceDictionary。默认键处理UWP中的Dark主题,因为当没有默认的“Dark”ResourceDictionary时,它将被默认使用。
Default和Light主题有近1000个控件特定颜色或更通用的“SystemControlForeground…”颜色,就像Rob展示的一样,但在UWP中,它们大多基于以下25个颜色类别:
  • 24系统颜色
  • SystemAccentColor,一种全局的用户定义颜色,在UWP文档中在“设计和UI”>“样式”>“颜色”下有一页详细介绍
    • 上述颜色有6个较浅和较深的阴影(SystemAccentColorLight1...Dark1等),但它们没有在默认资源字典中使用。然而,该颜色的0.6、0.8和0.9不透明度只在少数情况下使用,这是透明度被使用的唯一时机。

然后还有Windows 8.1保留下来的300多个颜色类别,手动选择特定的颜色,你可以在这里看到。

上述内容的唯一例外是InkToolBar的样式几乎全部派生自高对比度颜色。

高对比度主题,大量使用了8个额外的系统[空白]颜色,类似于SystemAccentColor,它们是操作系统范围内的值。如果用户选择了高对比度主题,它们将由模板和/或用户定义。高对比度也是一种辅助功能,所以我认为无论应用程序品牌如何,我都会避免覆盖那个ResourceDictionary。

但实际上,通过覆盖XAML框架中的SystemAccentColor和24个系统[空白]颜色,您可以在应用程序中以一致的方式影响数百个特定的颜色选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接