Как применить различные пользовательские темы (словари ресурсов) ко всему приложению с помощью WPF? - PullRequest
1 голос
/ 15 февраля 2012

Я хочу динамически менять пользовательскую тему для всего приложения. Темы представлены в виде словарей ресурсов с именами ExpressionDark.xaml и ExpressionLight.xaml (загружаются из Codeplex). Я использую поле со списком, чтобы выбрать подходящую тему. Смена темы происходит в событии SelectionChanged. Вот код:

private void themesComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ResourceDictionary resourceDictionary = new ResourceDictionary();

    int theme = ((ComboBox)sender).SelectedIndex;

    switch (theme)
    {
    case (int)Themes.Dark:
                resourceDictionary = Application.LoadComponent(
                new Uri(@"Themes\ExpressionDark.xaml",
                UriKind.Relative)) as ResourceDictionary;
                break;
            case (int)Themes.Light:
                resourceDictionary = Application.LoadComponent(
                new Uri(@"Themes\ExpressionLight.xaml",
                UriKind.Relative)) as ResourceDictionary;
                break;
            default:
                break;
    }

Application.Current.Resources = resourceDictionary;
}

Это прекрасно работает для текущего окна, но когда я запускаю экземпляр другого окна приложения, возникает исключение XamlParseException.

1 Ответ

2 голосов
/ 16 февраля 2012
ResourceDictionary skin = new ResourceDictionary();
skin.Source = new Uri("Themes\\ExpressionLight.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Clear();
Application.Current.Resources.MergedDictionaries.Add(skin);
...