Изменение ResourceDictionary не оказывает видимого влияния на Window в WPF - PullRequest
1 голос
/ 16 августа 2010

У меня есть простое приложение WPF, которое я использую для экспериментов.

У меня есть две темы, определенные в отдельных файлах xaml, изменение xaml для указания на них работало нормально. Кстати, в xaml я использую прямой ResourceDictionary элемент, а не ResourceDictionary.MergedDictionaries.

Я хочу позволить пользователю выбрать, какую тему использовать, поэтому я переустанавливаю свойство source в коде позади, но пока отладчик сообщает, что я успешно установил значение, при котором внешний вид приложения не изменяется. *

Итак, как успешно применить тему во время выполнения?

РЕДАКТИРОВАТЬ: Вот как я объявляю свой "стиль" в xaml:

<Window x:Class="WpfUI.winMain">
  <Window.Resources>
    <ResourceDictionary Source="Themes\Blah.xaml"></ResourceDictionary>
  </Window.Resources>

  // The windows grid and other controls...

</Window>

1 Ответ

1 голос
/ 16 августа 2010

Ответ прост: вам нужно очистить словари ресурсов слияния приложений. Вот некоторый код для начала

ResourceDictionary dictionary = GetThemeResourceDictionary(yourTheme) 

if (dictionary != null)
{
     App.Current.Resources.MergedDictionaries.Clear();
     App.Current.Resources.MergedDictionaries.Add(dictionary);
}

public ResourceDictionary GetThemeResourceDictionary(string theme)
{
    if (theme != null)
    {
        Assembly assembly = Assembly.LoadFrom("WPF.Themes.dll");
        string packUri = String.Format(YourThemeFolder/{0}.xaml", theme);
        return Application.LoadComponent(new Uri(packUri, UriKind.Relative)) as ResourceDictionary;
    }
    return null;
}

Если вы хотите действительно хорошее упакованное решение, я бы рекомендовал WPF themes . Он представляет класс ThemeManager и набор встроенных тем, которые действительно невероятны. Если у вас возникли трудности с установкой или добавлением новой темы, свяжитесь со мной:)

...