如何通过App.xaml中的资源字典中存储的代码动态更改样式?

时间:2017-06-07 15:57:51

标签: xaml uwp

我正努力让整个应用程序中的几种核心颜色能够由用户即时更改。我目前的想法是拥有一个SolidColorBrush,这是我的主题颜色"然后在我的主要风格中引用它。

<SolidColorBrush x:Key="ReflectiveColor1" Color="#FF0E777B"></SolidColorBrush>

此代码段存储在我的App.xaml

中引用的resourcedictionary中
<Application.Resources>
    <ResourceDictionary Source="DictionaryAlienwareTheme.xaml">
    </ResourceDictionary>
</Application.Resources>

当我尝试访问App.cs中的颜色时出现错误

 Application.Current.Resources["ReflectiveColor1"] = Colors.Black;

错误:

System.Runtime.InteropServices.COMException: 'No installed components were 
detected.
Local values are not allowed in resource dictionary with Source set 

有没有让这项工作?我假设这个错误是因为它不希望我们修改那里存储的样式,但我不知道解决方法。

2 个答案:

答案 0 :(得分:1)

在将所有资源字典合并在一起之前,应用程序将无法找到资源ReflectiveColor1

将您的App.xaml更改为合并词典。如下所示。

<Application.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="DictionaryAlienwareTheme.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

然后您应该能够像以前一样访问资源。

答案 1 :(得分:1)

首先,在您的App.xaml中,如果您想引用自己定义的DictionaryAlienwareTheme.xaml,则需要将字典合并到当前应用中,如@AVK所说。更多细节请参考&#34;合并资源词典&#34; this article的一部分。

其次,在使用合并资源后,如果要更新后面的主题资源代码,可能需要使用Application.Current.Resources.MergedDictionaries来访问合并的字典而不是Application.Current.Resources。例如,

public MainPage()
{
   this.InitializeComponent(); 
   var mergedDict = Application.Current.Resources.MergedDictionaries.FirstOrDefault();
   ((SolidColorBrush)mergedDict["ReflectiveColor1"]).Color = Colors.Red;
}

顺便说一下,如上面的代码段所示,ReflectiveColor1SolidColorBrush,您无法直接设置颜色。