我能够改变主题使用this.RequestedTheme = ElementTheme.Dark;
但我需要的是整个应用程序级别,因为这只会将当前页面的主题更改为黑暗.
每当我尝试这个时,App.Current.RequestedTheme = ApplicationTheme.Dark;
我总会得到这个错误
UWPApp.exe中出现"System.NotSupportedException"类型的异常,但未在用户代码中处理
有没有这样的方法,我可以将整个应用程序主题从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会引发异常(Microsoft .NET代码的NotSupportedException).如果您为用户提供选择属于应用程序UI的主题的选项,则必须将该设置保存在应用程序数据中,并在重新启动应用程序时应用该设置.
应该有解决方法,但他们会非常愚蠢.Microsoft在他们自己的官方应用程序如Groove中这样做...
我的解决方案是在元素级别而不是应用程序级别上进行主题更新.
创建自己的BasePage(继承自Page)
将您的设置保存在静态类下,并创建一个事件以跟踪模型更改.
在您的BasePage构造函数中,听取此事件并在有效时应用更改.
我现在无法提供代码示例(因为我今天非常忙),但这是迄今为止恕我直言最有效的方式.
我找到了另一个对我来说很好的解决方案。如果该应用程序具有一个加载页面的根框架(默认情况下就是这种情况),则可以将该根框架的请求主题设置为所需的值,并且该应用程序的主题无需重新启动即可更改。代码如下:
// Set theme for window root. if (Window.Current.Content is FrameworkElement frameworkElement) { frameworkElement.RequestedTheme = theme; }
我从Windows模板工作室的GitHub存储库片段在这里,所以这似乎有种要做到这一点的最好办法。