Max McKinney
Max McKinney

Reputation: 1218

How can I change a style via code that is stored in a resource dictionary in App.xaml on the fly?

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

Answers (2)

Sunteen Wu
Sunteen Wu

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

AVK
AVK

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

Related Questions