定义自定义主题样式

本文关键字:样式 自定义 定义 | 更新日期: 2023-09-27 18:19:14

好,我的问题是:

我正在尝试应用一些样式(颜色)到我现有的控件,例如设置一个按钮的前景。

为了实现这一点,我使用"静态资源",例如Foreground="{StaticResource PhoneSubtleBrush}"。所以,无论主题是什么(深色还是浅色),都选择了正确的颜色。

现在,如果我想定义一个自定义样式,而不是包含在静态资源中,该怎么办?如果——比如说——我想要一个特定的按钮以红色背景(暗模式)和蓝色背景(亮模式)出现呢?

我该怎么做呢?

定义自定义主题样式

如果我正确理解您的问题,您想在主题更改时更改按钮的背景颜色。如果是这样,您需要将您的资源引用为DynamicResource而不是StaticResource

你可以通过在你的黑暗和光明资源文件中声明相同的命名资源来做到这一点,比如在黑暗资源中:

<SolidColorBrush x:Key="ButtonBackgroundColor" Color="DodgerBlue"/>

和这个在光资源:

<SolidColorBrush x:Key="ButtonBackgroundColor" Color="SkyBlue"/>

然后在你的按钮设置背景为:

<Button Background="{DynamicResource ButtonBackgroundColor}"/>

这样,当您更改主题时,它将从与新主题相关的资源文件中获取新的ButtonBackgroundColor

对于您的按钮,您可以使用这样的内容:

Button.Background = new SolidColorBrush((Visibility)Application.Current.Resources["PhoneDarkThemeVisibility"] == Visibility.Visible ? Colors.Red : Colors.Blue);

还可以创建两个相同的按钮,对应于浅色和深色主题的标准,将它们的可见性绑定到静态资源PhoneDarkThemeVisibility,这样,如果活动的深色主题,您将看到浅色主题的深色按钮。请看这篇文章。这是"Only-XAML"的解决方案。

您还可以创建两个ResourceDictionaries,将深色和浅色主题的颜色定义为StaticResource(例如MyAccentColor),并根据当前主题使用一个或另一个字典。