Search code examples
c#wpfresourcedictionary

How to change ResourceDictionary Dynamically


I need to change ResourceDictionary in App.xaml file dynamically. I have tried the following code:

ResourceDictionary newRes = new ResourceDictionary();
newRes.Source = new Uri("/PsyboInventory;component/TitleBarResource.xaml", UriKind.RelativeOrAbsolute);
this.Resources.MergedDictionaries.Clear();
this.Resources.MergedDictionaries.Add(newRes);

There is no error, but the theme not change


Solution

  • In button click you can write this code

    var app = (App)Application.Current;
    app.ChangeTheme(new Uri("New Uri here"));
    

    ChangeTheme:

    public partial class App : Application
        {
            public ResourceDictionary ThemeDictionary
            {
                // You could probably get it via its name with some query logic as well.
                get { return Resources.MergedDictionaries[0]; }
            }
        
            public void ChangeTheme(Uri uri)
            {
                ThemeDictionary.MergedDictionaries.Clear();
                ThemeDictionary.MergedDictionaries.Add(new ResourceDictionary() { Source = uri });
            } 
           
        }   
    
        <Application.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary x:Name="ThemeDictionary">
                        <ResourceDictionary.MergedDictionaries>
                            <ResourceDictionary Source="/Themes/ShinyRed.xaml"/>
                        </ResourceDictionary.MergedDictionaries>
                    </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>