Domanda

Sto cercando di sviluppare un modo di passare stile applicazione Windows Phone 7 a seconda di un'impostazione. Gli stili simile a questa:

  • stili di base sono separati e definiti WP7Style_Dark.xaml e WP7Style_Light.xaml
  • il resto degli stili vengono dichiarati in Styles.xaml

Io uso il seguente codice per collegare i temi in App.xaml.cs:

var dictionaries = Resources.MergedDictionaries;
dictionaries.Clear();
string source = String.Format("/CommonUI;component/Resources/{0}.xaml", value == AppStyleSet.Light ? "WP7Style_Light" : "WP7Style_Dark");
//base styles
var themeStyles = new ResourceDictionary {Source = new Uri(source, UriKind.Relative)};
dictionaries.Add(themeStyles);
var generalStyles = new ResourceDictionary();
generalStyles.Source = new Uri("/CommonUI;component/Resources/Styles.xaml",UriKind.Relative);
dictionaries.Add(generalStyles);

Quando si esegue, l'impostazione generalStyles.Source genera un'eccezione (che è uno System.Exception affermando 'errore non specificato'). Ho scoperto l'eccezione va via se svuoto lo Styles.xaml, ma questo non è una soluzione, ovviamente.

Che cosa devo fare?

Aggiornamento 2: avvitare l'analisi dello stack, ecco il problema ristretto:

Gli stili tematici definiscono colori del tema. Gli stili generali continuano a carico bene fino a quando incontrano un legame, come questo

... <Setter Property="Color" Value="{StaticResource HighlightColor}" />

Quindi, la StaticResource non riesce a risolvere e genera l'eccezione. questo può essere evitato in qualche modo?

È stato utile?

Soluzione

Il problema che ho trovato con questo approccio è che ci sembra essere un po 'asincronia su come le risorse del dizionario si carica dal URL nella proprietà Source. Quindi quando si usa dizionario {StaticResource key} dove key è in un dizionario precedente può sicuro.

Una soluzione soluzione sarebbe quella di estrarre il codice XAML utilizzando Application.GetResourceStream e StreamReader. Quindi utilizzare XamlReader per costruire il ResourceDictionary. In questo modo si può essere sicuri che dizionari dipendenti possono trovare risorse statiche di cui hanno bisogno.

Si noti che avrebbe bisogno di assicurarsi di aver aggiunto ogni dizionario, dove in modo che sia parte della struttura Application.Resources prima di caricare ulteriori dizionari dipendenti.

Altri suggerimenti

WP7 è basata su Silverlight 3+ e per impostazione predefinita, non è possibile creare un nuovo dizionario risorse nel codice, che è il motivo per cui si riceve una System.Exception affermando un "UnspecifiedError".

La soluzione, semplice creare un ResourceDictionary come se si stesse utilizzando Silverlight3 - seguire questa esercitazione .

Spero che questo risolve il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top