2010-12-11 25 views
1

J'ai Windows Phone App et je veux avoir une ressource thématique différente selon que l'utilisateur a un thème sombre ou clair et quelle couleur d'accent ils ont choisi.Maux de tête avec la configuration des ressources thématiques de C# (Windows Phone)

Dans mon code d'initialisation de l'application, je détecte le thème des utilisateurs et la couleur de l'accent, puis charge le dictionnaire de ressources approprié, Dark, Light, etc J'ajoute le dictionnaire de ressources à la collection App.Current.Resources.MergedDictionaries.

Le problème vient quand je veux référencer une valeur dans le (dynamiquement chargé) de mon App.Xaml. Dans l'exemple ci-dessous, la clé est "DefaultBackgroundImageOpacity". Pour une raison quelconque, les valeurs dans ResourceDictionary que je charge dans la collection MergedDictionaries ne sont jamais trouvées lorsque l'analyse App.Xaml se produit. J'ai joué avec le chargement des ressources avant d'appeler InitializeComponent() et après. Ni l'un ni l'autre ne semblent résoudre le problème.

Des idées?

// Simplified version of adding some xaml... 
// Note I'm loading the key "DefaultBackgroundImageOpacity" 
this.Resources.MergedDictionaries.Clear(); 

var myTestXaml = "<ResourceDictionary xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' xmlns:System='clr-namespace:System;assembly=mscorlib'> <System:Double x:Key='DefaultBackgroundImageOpacity'>0.2</System:Double></ResourceDictionary>"; 

this.Resources.MergedDictionaries.Add((ResourceDictionary)XamlReader.Load(myTestXaml)); 

// This always fails saying that the key "DefaultBackgroundImageOpacity" 
// can not be foudnd - even though it was loaded just above 
InitializeComponent(); 

// Phone-specific initialization 
InitializePhoneApplication(); 
+0

Il est marqué WP7 * et * SL4? – Gabe

Répondre

-1

Je soupçonne que votre app.xaml contient quelque chose comme ceci: -

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/somedictionary.xaml" /> 
      ... 
     </ResourceDictionary.MergedDictionaries> 
     ... 
    </ResourceDictionary> 
</Application.Resources> 

Si tel est le cas alors InitializeComponent remplacera la valeur par défaut ResourceDictionary que vous avez manipulé votre code d'où vos modifications seront MergeDictionaries pas être présent puisque cette instance d'un ResourceDictionary n'est plus référencée.

Si vous ne configurez aucun MergedDictionaries dans App.Xaml, veillez à ajouter des ressources directement à Applicaiton.Resources et ne créez pas une nouvelle instance de ResourceDictionary dans le xaml.

+0

Merci Anthony. Non, je n'ai pas ResourceDictionary.MergedDictionaries dans mon app.xaml. J'appelle juste this.Resources.MergedDictionaries.Add (... Dois-je avoir une entrée dans app.xaml pour faire ce travail? – will

+0

@Will: Pas le contraire si vous aviez une telle enty dans votre app.xaml il effacerait les modifications que vous aviez fait de l'instance par défaut du dictionnaire de ressources – AnthonyWJones

+0

Ok. J'ai fini par devoir écrire du code pour "modifier à la main" tous les endroits où j'avais besoin de ressources thématiques, cela ressemblait à un scénario central mais je ne pouvais pas t trouver la réponse ... – will