我正努力让整个应用程序中的几种核心颜色能够由用户即时更改。我目前的想法是拥有一个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
有没有让这项工作?我假设这个错误是因为它不希望我们修改那里存储的样式,但我不知道解决方法。
答案 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;
}
顺便说一下,如上面的代码段所示,ReflectiveColor1
是SolidColorBrush
,您无法直接设置颜色。