2010-08-16 6 views
1

J'ai une application WPF simple que j'utilise pour expérimenter.Modification de ResourceDictionary n'affecte pas visiblement la fenêtre dans WPF

J'ai deux thèmes définis dans des fichiers xaml séparés, en changeant le xaml pour pointer vers eux a bien fonctionné. En passant, dans le xaml j'utilise un élément droit ResourceDictionary, pas un ResourceDictionary.MergedDictionaries. Je souhaite laisser l'utilisateur sélectionner le thème à utiliser, donc je réinitialise la propriété source dans le code derrière - mais alors que le débogueur me dit que j'ai réussi à définir la valeur, l'apparence des applications ne change pas. Alors, comment appliquez-vous avec succès un thème lors de l'exécution?

EDIT: Voici comment je déclarer mon « style » dans le XAML:

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

    // The windows grid and other controls... 

</Window> 
+0

Faire un nouveau ResourceDictionary (en code) et appeler ApplyTemplate() applique avec succès le thème/style - mais pas sur tous les contrôles. –

Répondre

1

La réponse est simple, vous devez effacer les applications fusionnées dictionnaires de ressources. Voici un code pour vous aider à démarrer

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; 
} 

Si vous voulez une solution packagée vraiment sympa, je recommanderais WPF themes. Il introduit une classe ThemeManager et un ensemble de thèmes intégrés qui sont vraiment incroyables. Si vous avez des difficultés à l'installer ou à ajouter un nouveau thème, contactez-moi :)

+0

Cool - merci! Laisse moi vérifier ça. –

+0

Hmm - ne semble pas fonctionner pour moi - est-ce que je spécifie le ResourceDictionary dans le xaml? (Je l'ai depuis ajouté à la question - désolé, il n'est pas sur cette machine donc pas facile de copier le code entier) –

+0

AAh kk je t'ai eu. le problème est, cette solution est destinée à appliquer l'application de thème large. Quelques choses à vérifier. Tout d'abord, vérifiez que vous récupérez le dictionnaire de ressources. Ensuite, remplacez App.Current.Resouces par WPFui.winMain.Resources. Vous voulez effacer les ressources que vous avez sur cette fenêtre particulière. Je recommanderais d'appliquer une application de style large. Vous pouvez le faire en utilisant Application.Resources. – TerrorAustralis