UWP 应用程序中的自定义主题

Custom Themes in UWP Application

我正在开发一个 UWP 应用程序,我想在其中从文件(包含颜色代码)动态设置主题。

我创建的文件是一个 XML 文件,其节点包含映射到应用程序控件的颜色代码。

用户可以在提供的 XML 文件中更新颜色代码,这应该反映应用程序中的主题变化。

我可以为此文件设置任何自定义位置,以便用户可以编辑文件的内容吗?

这是在 UWP 应用程序中实现主题的正确方法吗。

另外,我对UWP技术还比较陌生

提前致谢。

默认情况下,UWP 应用程序支持两个主题 - LightDark

您可以通过将 RequestedTheme 属性 设置为其中一个值(默认设置为 Light)来在 App.xaml 中指定应用的主题或者在 App 构造函数中的 App.xaml.cs 中使用 RequestedTheme = ApplicationTheme.Light;(以后在任何地方更改它都会导致抛出异常)。

如果您不设置 RequestedTheme 属性,它将在任何 W10 移动设备或 W10 PC 运行 周年更新上反映 Settings > Personalization > Colors 中设置的主题和较新的版本。在较旧的 Windows 10 桌面版本上,它将是 Light

您还可以设置任何特定 FrameworkElement 的主题,默认设置为 ElementTheme.Default,因此它会从其父项继承主题。

<StackPanel RequestedTheme="Light">
   <TextBlock>Text using light theme.</TextBlock>
   <TextBlock RequestedTheme="Dark">Text using dark theme.</TextBlock>
</StackPanel>

对于颜色自定义,UWP 通常也使用用户在 Settings > Personalization > Colors 中指定的强调色。

要反映在“设置”应用中为某些元素指定自定义颜色的主题和强调色设置,您必须使用 ThemeResource。您可以使用预定义的 XAML 主题资源,例如此边框的背景颜色在 Light 主题中为 #FFFFFFFF,在 Dark 主题中为 #FF000000

<Border Background="{ThemeResource SystemControlBackgroundAltHighBrush}"/>

或者您可以使用 SystemControlBackgroundAccentBrush,它将反映在“设置”应用中选择的强调色。

您也可以编写自己的 theme dictionary 来指定每个主题的颜色。这是一个简单的主题词典的例子:

<ResourceDictionary.ThemeDictionaries>
    <ResourceDictionary x:Key="Light">
        <SolidColorBrush x:Key="MyButtonBackgroundThemeBrush" Color="White"/
        <SolidColorBrush x:Key="MyButtonForegroundThemeBrush" Color="Black"/>
    </ResourceDictionary>
    <ResourceDictionary x:Key="Dark">
        <SolidColorBrush x:Key="MyButtonBackgroundThemeBrush" Color="Black"/>
        <SolidColorBrush x:Key="MyButtonForegroundThemeBrush" Color="White"/>
    </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>

您将像这样使用它:

<Button Content="Themed button"
        Background="{ThemeResource MyButtonBackgroundThemeBrush}"
        Foreground="{ThemeResource MyButtonForegroundThemeBrush}"/
        />

Light 主题中按钮的背景为 White,前景为 Black,而 Dark 中的 BlackWhite ]主题。

您可以阅读更多关于 ThemeResource、主题、HighContrast 主题和默认主题资源 here

此外,我建议您观看第 9 频道的 this 视频,其中对 XAML 主题进行了解释,即使使用 HighContrast 主题也是如此。