Reputation: 1218
I am trying to have the ability for several core colors throughout the app to be changeable on the fly by the user. My current idea is to have a single SolidColorBrush that is my "theme color" and then to reference that throughout my main styles.
<SolidColorBrush x:Key="ReflectiveColor1" Color="#FF0E777B"></SolidColorBrush>
This snippet is stored in a resourcedictionary that is reference in my App.xaml
<Application.Resources>
<ResourceDictionary Source="DictionaryAlienwareTheme.xaml">
</ResourceDictionary>
</Application.Resources>
When I try and access the color in my App.cs I get an error
Application.Current.Resources["ReflectiveColor1"] = Colors.Black;
Error:
System.Runtime.InteropServices.COMException: 'No installed components were
detected.
Local values are not allowed in resource dictionary with Source set
Is there anyway to make this work? I'm assuming this error is because it doesn't want us to modify styles stored there, but I don't know the workaround.
Upvotes: 1
Views: 664
Reputation: 10627
Firstly, in your App.xaml
if you want to reference the DictionaryAlienwareTheme.xaml
you defined by yourself you need to merge the dictionaries to current app as @AVK said. More details please reference "Merged resource dictionaries" section of this article.
Secondly, after you use the merged resource, if you want to update the theme resource code behind you may need to use Application.Current.Resources.MergedDictionaries
to visit the merged dictionaries instead of Application.Current.Resources
. For example,
public MainPage()
{
this.InitializeComponent();
var mergedDict = Application.Current.Resources.MergedDictionaries.FirstOrDefault();
((SolidColorBrush)mergedDict["ReflectiveColor1"]).Color = Colors.Red;
}
By the way, as above code snippet showed, ReflectiveColor1
is SolidColorBrush
you cannot set color directly.
Upvotes: 1
Reputation: 3923
Application will not be able to find the Resource ReflectiveColor1
until you merge all resource dictionaries together.
Change your App.xaml
to Merge the dictionaries. Like below.
<Application.Resources>
<ResourceDictionary >
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="DictionaryAlienwareTheme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Then you should be able to access the Resource in the same way that you were doing before.
Upvotes: 1