none
Theme zur Laufzeit ändern RRS feed

  • Frage

  • Ich möchte in meine Applikation das Thema zur Auswahl zu stellen.
    Dafür hab ich erstmal folgende Verzeichnisstruktur angelegt:

    Themes\ThemeA\Background.jpg
    Themes\ThemeA\System.Windows.xaml  <-- 'angepasste' Datei aus dem Toolkit
    Themes\ThemeA\ThemeResources.xaml  <-- 'angepasste' Datei aus dem Toolkit
    Themes\ThemeA.xaml

    Themes\ThemeB\Background.jpg
    Themes\ThemeB\System.Windows.xaml  <-- 'angepasste' Datei aus dem Toolkit
    Themes\ThemeBA\ThemeResources.xaml  <-- 'angepasste' Datei aus dem Toolkit
    Themes\ThemeB.xaml

    Themes\ThemeA.xaml:

    <ResourceDictionary>
     <ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="/MyApp;component/Themes/ThemeA/System.Windows.xaml"/>
     <ResourceDictionary Source="/MyApp;component/Themes/ThemeA/ThemeResources.xaml"/>
     <ResourceDictionary>
     <ImageBrush x:Key="PanoramaBackground" Stretch="UniformToFill" ImageSource="/Themes/ThemeA/Background.jpg" />
     <SolidColorBrush x:Key="ErrorForeground">#FFFF0000</SolidColorBrush>
     </ResourceDictionary>
     </ResourceDictionary.MergedDictionaries>
     </ResourceDictionary>


     
     und in App.xaml:
     

     <Application.Resources>  
     <ResourceDictionary>
     <ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="/MyApp;component/Themes/ThemeA.xaml"/>
     </ResourceDictionary.MergedDictionaries>
     <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
     ...
     </ResourceDictionary>
     </Application.Resources>


     
    Damit startet die App mit ThemeA hoch - stelle zur Compile-Time auf ThemeB um startet sie mit ThemeB.
    Dann hab ich meine Page erstellt auf der Buttons für ThemeA und ThemeB sind:

     private void LoadDictionary(string uriString)
     {
     var uri =new Uri(uriString, UriKind.Relative);
     var resourceDictionary = new ResourceDictionary();
     resourceDictionary.Source = _uri;
     if (null != resourceDictionary["PanoramaBackground"])
     {
     App.Current.Resources.MergedDictionaries.Clear();
     App.Current.Resources.MergedDictionaries.Add(resourceDictionary);
     }
     _uri = uri; // For later use...
     // Update at least the background image
     LayoutRoot.Background = (ImageBrush)App.Current.Resources["PanoramaBackground"];
     LayoutRoot.UpdateLayout();
     }
     private void ThemeA_Click(object sender, EventArgs e)
     {
     LoadDictionary("/MyApp;component/Themes/ThemeA.xaml");
     }

     
    Damit zu meinen eigentlichen Problem(en):

    wenn ich die Page aufrufe wird der Background immer erst beim _zweiten_ Click angezeigt ??? gibt es eine Möglichkeit dass alle Settings neu geladen werden?

    Aktuell binde ich Styles mittels Style="{StaticResource PhoneTextTitle1Style}" bzw. Background="{StaticResource PanoramaBackground}" aber damit aktualisieren sich die Werte ja nicht automatisch ???

    Ich vermute mal dass ich alle gewünschten Properties auf dieser Page explizit über ein ViewModel binden werden muss.

    Wird das gewählte Thema mit "ok" bestätigt dachte ich mir dass ich in der App.xaml.cs im Konstruktor LoadDictionary() aufrufen werde. 

    Freitag, 11. März 2011 11:31

Antworten

  • Hi Robert,

    bitte setzte den Quelltext in die dafür vorgesehenen Codeblöcke. Dadurch ist dein Quelltext besser lesbar und man sieht deutlicher was Quelltext und was dein normaler Text ist.

    Die Codeblöcke kannst du über die letzte Schaltfläche in der Toolbar setzen.

    Gruß

    Rudolf 

    Freitag, 11. März 2011 12:53