2011-01-09 5 views
3

Ich mache eine Windows Phone 7-Anwendung und ich bin ein bisschen verwirrt mit dunklen/hellen Themen.Theme-bewusst XAML-Ressourcen in einem WP7-Projekt

Mit einem Panorama setzen Sie sehr oft ein Hintergrundbild. Das Problem ist, dass es sehr schwierig ist, ein Bild zu machen, das sowohl für dunkle als auch für helle Themen geeignet ist. Wie sollen wir vorgehen?

Gibt es eine Möglichkeit, ein dunkles/helles Thema für ein Panorama zu erzwingen? Dadurch vermeiden Sie themenspezifische Panorama-Hintergrundbilder. Wie mache ich das? Ich habe XAML-Dateien in C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Design gefunden. Wenn dies ein richtiger Weg ist, wie kann ich sie für mein Panorama importieren?

Oder wenn es keine Möglichkeit gibt (oder wenn es falsch ist), ein dunkles/helles Thema zu erzwingen: Wie schreibt man bedingtes XAML, um korrekte Ressourcen zu setzen? Nun habe ich das folgende XAML (default.xaml), die mit dem dunklen Thema in Ordnung ist:

<ImageBrush x:Key="PageBackground" ImageSource="Resources/PageBackground.png" Stretch="None" /> 
<ImageBrush x:Key="PanoramaBackground" ImageSource="Resources/PanoramaBackground.png" Stretch="None" /> 

Aber wenn ich ein leichtes Thema verwenden, schwarze Kontrollen und schwarze Texte sind hart mit meinem dunklen Hintergrund Bilder zu lesen. Also machte ich verschiedene Bilder, die ich auf diese Weise verwenden kann:

<ImageBrush x:Key="PageBackground" ImageSource="Resources/PageBackgroundLight.png" Stretch="None" /> 
<ImageBrush x:Key="PanoramaBackground" ImageSource="Resources/PanoramaBackgroundLight.png" Stretch="None" /> 

Nun meine Frage ist XAML abhängig zu machen, das Richtige zu erklären, auf dem aktuellen Thema abhängig.

Ich fand keinen relevanten Weg im Internet. Ich würde es vorziehen, keinen Code oder Code-Behind dafür zu verwenden, weil ich glaube, dass XAML dazu in der Lage ist (ich weiß einfach nicht wie).

EDIT: Codefragment eine XAML-Datei als Resource

string xaml = null; 
StreamResourceInfo xamlInfo = Application.GetResourceStream(new Uri("light.xaml", UriKind.Relative)); 
using (StreamReader sr = new StreamReader(xamlInfo.Stream)) 
    xaml = sr.ReadToEnd(); 
dic = (ResourceDictionary)XamlReader.Load(xaml); 
this.Resources.MergedDictionaries.Add(dic); 

Antwort

5

Um ein dunkles oder weißes Thema, das Sie in der Tat die Stile in dem Ordner, den Sie darauf hingewiesen definiert verwenden können, zwingen zu laden. Kopieren und fügen Sie die Regeln ein, die Sie für Ihre App.xaml benötigen (nur PhoneForegroundColor, PhoneBackgroundColor und die verwandten Brushes wären ein guter Anfang).

Es ist wahrscheinlich besser, "themenbewusst" zu bleiben und ein anderes Bild für helle und dunkle Themen zu laden. Hier ist ein Artikel, der erklärt, wie man das macht: http://blog.jayway.com/2010/12/16/theme-aware-panorama-background-in-windows-phone-7/

+0

Sehr relevante Antwort und Artikel. Jedoch denke ich, es ist nicht die Verantwortung des ViewModels, dieses Problem zu behandeln. Wenn man keinen XAML-Weg findet Dies ist ein guter Workaround – SandRock

+0

Ich glaube nicht, dass es einen reinen XAML-Weg (keine bedingte XAML) gibt.Weitere Optionen wäre, einen benutzerdefinierten ValueConverter zu schreiben, um den richtigen Hintergrund oder ein ContentControl auszuwählen, die einen von zwei auswählt DataTemplates je nach Thema – Yousef

+1

Ok, danach habe ich ein Licht erstellt.XAML-Datei (Build Aktion: Inhalt, Kopieren: nicht kopieren). Diese Datei enthält Ressourcen, die ich überschreiben möchte, wenn der Benutzer ein helles Thema verwendet. In App.xaml.cs, nach 'InitializePhoneApplication();' wenn der Light-Theme-Test bestanden wird, lade ich light.xaml dynamisch. Dies ist kein Voll-XAML-Weg, aber es sind nur 5 Zeilen Code beteiligt. – SandRock

0

Es gibt eine andere Möglichkeit, die ich gefunden habe: Sie können den Coding4Fun Toolkit Konverter nach these instructions verwenden. Allerdings kann ich sie nicht richtig verwenden. Eine andere Möglichkeit ist die Verwendung eines OpacityMask. Aber das funktioniert nur für schwarz/weiße Bilder:/

Yousefs Lösung sieht interessant aus. , aber das Laden dauert zu lange. Das Bild wird etwa 1 Sekunde nach dem Start der App geändert. Ich habe dies auf einem Nokia 820 getestet. Ich habe den Aufruf für die Einstellung der DataContext in einem Loaded Event verschoben, die viel später aufgerufen wurde. Jetzt findet der Aufruf im Konstruktor statt, sodass das Bild bereits festgelegt wird, wenn es in der Anwendung angezeigt wird. Jedoch fügt es noch mehr Ladezeit hinzu :(Irgendwelche Vorschläge, wie man das verbessert?

Verwandte Themen