以编程方式更改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页面之外没有太多关于这种情况的信息:
主题只能在应用程序启动时设置,而不是在运行时设置。 在应用程序运行时尝试设置RequestedTheme会引发exception(Microsoft .NET代码的NotSupportedException)。 如果您为用户提供选择属于应用程序UI的主题的选项,则必须将该设置保存在应用程序数据中,并在重新启动应用程序时应用该设置。
应该有解决方法,但它们会非常愚蠢.Microsoft在他们自己的官方应用程序如Groove中这样做…
我的解决方案是在元素级别而不是应用程序级别上进行主题更新。
- 创建自己的BasePage(inheritance自Page)
- 将您的设置保存在静态类下,并创建一个事件以跟踪模型更改。
- 在您的BasePage构造函数中,听取此事件并在有效时应用更改。
我现在无法提供代码示例(因为我今天非常忙),但这是迄今为止恕我直言最有效的方式。
我找到了另一个对我来说非常好的解决方案。 如果应用程序具有加载页面的根框架(默认情况下是这种情况),我可以将该根框架的请求主题设置为所需的值,并且应用程序的主题在不重新启动的情况下进行了更改。 代码如下所示:
// Set theme for window root. if (Window.Current.Content is FrameworkElement frameworkElement) { frameworkElement.RequestedTheme = theme; }
我在这里从Windows Template Studio GitHub存储库获得了该片段,所以这似乎是最好的方法。