以编程方式更改Windows 10 UWP App中的主题

我能够使用this.RequestedTheme = ElementTheme.Dark;更改主题this.RequestedTheme = ElementTheme.Dark; 但我需要的是整个应用程序级别,因为这只会将当前页面的主题更改为黑暗。

每当我尝试这个App.Current.RequestedTheme = ApplicationTheme.Dark; 我总是得到这个错误

UWPApp.exe中出现“System.NotSupportedException”类型的exception,但未在用户代码中处理

有没有这样的方法,我可以将整个应用程序主题从Light更改为Dark,反之亦然?

我正在使用VS2015

更新了我最终决定的答案。

我使用了一个包含所有应用程序设置的设置类,包括要使用的主题。 由于主题只能在启动时设置,我们需要确保将它们设置为主题。 这是我使用的代码:

在App.xaml.cs文件中:

 public App() { //Load settings AppSettings.LoadSettings(); this.RequestedTheme = AppSettings.SelectedTheme; this.InitializeComponent(); } 

在App.xaml文件中,请确保删除此属性:

  RequestedTheme="Light" 

如果没有删除它,它总是默认为亮,无法改变它。

这样,用户可以选择主题,在应用启动时存储和使用主题。 只需确保加载它并在应用程序初始化阶段应用它。

应用程序的RequestedTheme只能在构造函数中更新。但是(如您所发现的),Page的RequestedTheme可以在运行时随时更新。

这真的很烦人,我知道除了这个MSDN页面之外没有太多关于这种情况的信息:

https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.requestedtheme?f=255&MSPPError=-2147217396

主题只能在应用程序启动时设置,而不是在运行时设置。 在应用程序运行时尝试设置RequestedTheme会引发exception(Microsoft .NET代码的NotSupportedException)。 如果您为用户提供选择属于应用程序UI的主题的选项,则必须将该设置保存在应用程序数据中,并在重新启动应用程序时应用该设置。

应该有解决方法,但它们会非常愚蠢.Microsoft在他们自己的官方应用程序如Groove中这样做…

我的解决方案是在元素级别而不是应用程序级别上进行主题更新。

  1. 创建自己的BasePage(inheritance自Page)
  2. 将您的设置保存在静态类下,并创建一个事件以跟踪模型更改。
  3. 在您的BasePage构造函数中,听取此事件并在有效时应用更改。

我现在无法提供代码示例(因为我今天非常忙),但这是迄今为止恕我直言最有效的方式。

我找到了另一个对我来说非常好的解决方案。 如果应用程序具有加载页面的根框架(默认情况下是这种情况),我可以将该根框架的请求主题设置为所需的值,并且应用程序的主题在不重新启动的情况下进行了更改。 代码如下所示:

 // Set theme for window root. if (Window.Current.Content is FrameworkElement frameworkElement) { frameworkElement.RequestedTheme = theme; } 

我在这里从Windows Template Studio GitHub存储库获得了该片段,所以这似乎是最好的方法。