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