在运行时动态更改ThemeResource/StaticResource或Win8 XAML应用程序中的其他应用程序?

Ste*_*eve 5 c# xaml windows-8 windows-8.1

我有一个Windows 8.1 XAML应用程序.我想允许用户自己定制应用程序的主题 - 例如,我想给他们一个颜色选择器,他们可以在应用程序中设置各种颜色,这将设置我的应用程序使用的各种资源.

但问题是,我无法找到如何动态更改资源的价值.我在8.1中知道他们添加了一个主题资源的概念,它允许我在运行时从轻微主题变为黑暗主题,而不是.但我的问题是我想说'backgroundColor资源现在是橙色的,所有使用此资源的项目都会反映出这种变化'

我相信DynamicResource XAML元素是我所需要的,但它似乎来自WPF而Win8中不支持.有没有人有建议?

Sim*_*han 6

只能使用以下方法更改Colora SolidColorBrush:

(Application.Current.Resources["BackgroundBrush"] as SolidColorBrush).Color = Colors.Orange;
Run Code Online (Sandbox Code Playgroud)

它是因为SolidColorBrush是a class,所有元素都有引用它,更改其属性将反映到所有元素.但是这样的改变Color是行不通的.structXXXColor

我只在Windows Phone Runtime 8.1 APP上测试过它,但它也适用于Windows Runtime 8.1 APP.


Nig*_*son 4

所有的应用程序资源都存储在

Application.Current.Resources
Run Code Online (Sandbox Code Playgroud)

字典。您的代码可以在运行时插入该字典。您需要在启动时执行此操作,因为引用不存在的资源的任何 xaml 页面都会崩溃。此外,一旦通过 StaticResource 扩展引用它,就无法真正对其进行修改。

我建议做的是在应用程序启动代码中检测用户想要的主题,并使用该主题的颜色和画笔初始化资源字典。

Application.Current.Resources["HighlightThemeBrush"] = new SolidColorBrush(255, 168,  243, 108);
Run Code Online (Sandbox Code Playgroud)

如果用户想要更改主题,请将其存储在设置中并通知用户,当他们重新启动应用程序时,主题将会更改。您会注意到,这是具有自定义主题的应用程序中非常常见的模式。