如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?
Posted
技术标签:
【中文标题】如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?【英文标题】:How to programmatically change background theme of Win 8.1 or Win 10 UWP app? 【发布时间】:2016-02-18 14:13:15 【问题描述】:我有一个适用于 Windows Phone 8.1 的应用程序及其 UWP 版本。我想在 Windows 中更改应用程序的背景时动态更改它。
用例是:
-
启动应用,背景为暗色。
按手机上的主页按钮
将背景主题更改为浅色
回到应用程序(基本上从后台切换到它)
应用的主题将自动更改为新主题
我希望它像这样完成,而不需要重新启动。我在其他应用程序中看到过这个,所以它必须以某种方式成为可能,但我无法弄清楚。
如果需要重新启动,也可以作为解决方案 B。
谢谢。
【问题讨论】:
【参考方案1】:我建议创建设置单例类来存储 AppTheme 状态并实现 INotifyPropertyChanged 接口
public class Settings : INotifyPropertyChanged
private static volatile Settings instance;
private static readonly object SyncRoot = new object();
private ElementTheme appTheme;
private Settings()
this.appTheme = ApplicationData.Current.LocalSettings.Values.ContainsKey("AppTheme")
? (ElementTheme)ApplicationData.Current.LocalSettings.Values["AppTheme"]
: ElementTheme.Default;
public static Settings Instance
get
if (instance != null)
return instance;
lock (SyncRoot)
if (instance == null)
instance = new Settings();
return instance;
public ElementTheme AppTheme
get
return this.appTheme;
set
ApplicationData.Current.LocalSettings.Values["AppTheme"] = (int)value;
this.OnPropertyChanged();
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
然后,您可以在页面上创建属性设置,这将返回单例的值并将页面的 RequestedTheme 绑定到 AppTheme 属性
<Page
x:Class="SamplePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
RequestedTheme="x:Bind Settings.AppTheme, Mode=OneWay">
【讨论】:
如何在应用程序启动时获取 Windows 主题(深色或浅色)以便我可以将该值设置为 Settings.Apptheme? 启动时可以使用应用程序的 RequestedTheme 属性,它将是 ApplicationTheme 类型而不是 ElementTheme,但它具有相同的枚举值 非常感谢您提供的信息。同时我发现,如果我没有在 app.xaml 文件中设置 App.RequestedTheme,我就会得到我想要的东西。也就是说,应用程序的主题更改为操作系统中设置的主题。之前我曾想过我需要自己从代码中做到这一点。不过,您的两个回答都帮了大忙。 当我尝试这个时,我在 xaml 上收到一个错误,指出“无效的绑定路径 'Settings.AppTheme':在类型 'MainPage' 上找不到属性 'Settings'”【参考方案2】:使用ThemeResource
而不是StaticResource
来表示可能在运行时改变的颜色:
ThemeResource ApplicationPageBackgroundThemeBrush
【讨论】:
【参考方案3】:我的问题的答案是我不需要在 app.xaml 文件中设置 App.RequestedTheme 属性以使应用程序的主题遵循操作系统之一。
我只是觉得需要通过代码手动完成。
【讨论】:
以上是关于如何以编程方式更改 Win 8.1 或 Win 10 UWP 应用的背景主题?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 7 或 Windows 8.1用户如何免费升级至Windows 10?