Измените тему в WPF, тема не меняется
Это всего лишь черновик для POC!
The Dictionary hierarchy is; Colors Brushes Styles So the ordering is important
Я пытаюсь изменить тему в WPF, я могу сделать это так;
+ private void ChangeTheme(string themeName) + { + ResourceDictionary resource = null; + using (FileStream fs = new FileStream("../../../Resources/ResourceDictionaries/" + themeName + ".xaml", FileMode.Open, FileAccess.Read)) + resource = (ResourceDictionary)XamlReader.Load(fs); + + Application.Current.Resources.MergedDictionaries.Clear(); + Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() + { Source = new Uri("pack://application:,,,/Resources/ResourceDictionaries/dictionary1.xaml") }); + Application.Current.Resources.MergedDictionaries.Add(resource); + Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() + { Source = new Uri("pack://application:,,,/Resources/ResourceDictionaries/Monotone.Brushes.xaml") }); + Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() + { Source = new Uri("pack://application:,,,/Resources/ResourceDictionaries/Monotone.xaml") }); + }
Но если я добавлю больше ResourceDictionaries в проект, мне придется вернуться сюда и внести изменения в список.
Что я уже пробовал:
Поэтому я подумал, что сделаю это таким образом, но это, похоже, не работает. Тема не меняется! Новая тема загружается, старые словари переносятся в dictionaryCollection, и все добавляется обратно в приложение.Текущий.Ресурсы.MergedDictionariy но новая тема не показывается?
Я погуглил пару часов, и все, что я нашел, говорит, что это должно сработать?
private void ChangeTheme(string themeName) { ResourceDictionary resource = null; string file = "../../../Resources/ResourceDictionaries/" + themeName + ".xaml"; //using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) // resource = (ResourceDictionary)XamlReader.Load(fs); resource = new ResourceDictionary(); resource.Source = new Uri(file, UriKind.Relative); ResourceDictionary rd = GetActualResourceDictionary(); if (rd != null) Application.Current.Resources.MergedDictionaries.Remove(rd); // Create collection to hold old RecourceDictionaries System.Collections.ObjectModel.Collection<ResourceDictionary> dictionaryCollection = new System.Collections.ObjectModel.Collection<ResourceDictionary>(); // Copy REsourceDictionaries left after removing the Theme foreach (ResourceDictionary dict in Application.Current.Resources.MergedDictionaries) dictionaryCollection.Add(dict); Application.Current.Resources.MergedDictionaries.Clear(); Application.Current.Resources.MergedDictionaries.Add(resource); foreach (ResourceDictionary dict in dictionaryCollection) Application.Current.Resources.MergedDictionaries.Add(dict); } //NOTE This works but the static ResourceDictionary GetActualResourceDictionary() { // get the actual ResourceDictionary foreach (ResourceDictionary res in Application.Current.Resources.MergedDictionaries) { if (res.Source != null) { string source = res.Source.ToString(); if (source.ToUpper().Contains("THEME")) return res; } } return null; }