2017-04-06 2 views
0

Ist es möglich, ein ResourceDictionary eines anderen Stils zur Laufzeit abhängig von einer bestimmten Bedingung dynamisch zu laden?UWP - Dynamisch verschiedene Styles.xaml laden

Ich möchte einen einzelnen Build meiner App haben, aber unterschiedliche Farben/Branding haben, abhängig von einer bestimmten Einstellung. Angenommen, das oben Gesagte ist nicht möglich, würde ich das am besten erreichen?

Antwort

1

ResourceDictionary kann nicht dynamisch zur Laufzeit eingestellt werden, soweit ich mich erinnere - nicht auf UWP. IMHO die einzige Möglichkeit ist, ColorBrushes oder die ganzen Stile zu ändern.

Erste Option: Wenn Sie Farben benötigen dynamisch ändern, dann müssen Sie Pinsel in Resource

<SolidColorBrush x:Key="MyBrush">#333344</SolidColorBrush> 

und verwenden Sie es mit Ihrem styles/XAML-Layout und so weiter erstellen.

Um es zu ändern, müssten Sie (vorausgesetzt, Sie haben nur eine Ressource oder die mit Farbpinseln zuerst) den Pinsel aus dem Wörterbuch nehmen und seine Farbe ersetzen.

if (Application.Current.Resources.MergedDictionaries[0].ContainsKey("MyBrush")) 
{ 
    var brush = Application.Current.Resources.MergedDictionaries[0]["MyBrush"] as SolidColorBrush; 
    if (brush != null) 
    { 
     brush.Color = return new Color() { A = 255, R = r, G = g, B = b }; 
    } 
} 

Zweite Möglichkeit: Wenn Sie die ganze Stil zur Laufzeit ändern müssen (vorausgesetzt, Sie MyStyle und MyOtherStyle innerhalb Ressourcenwörter gesetzt haben, und wollen einige Steuerelement mit dem Namen MyControl anwenden es):

switch(anyValue) 
{ 
    case 1: 
      var myStyle = Application.Current.Resources["MyStyle"] as Style; 
      if(myStyle != null) 
      { 
       MyControl.Style = myStyle;     
      } 
      break; 
    case 2: 
      var myOtherStyle = Application.Current.Resources["MyOtherStyle"] as Style; 
      if(myOtherStyle != null) 
      { 
       MyControl.Style = myOtherStyle;     
      } 
      break; 
} 

Dritte Option: Ändern Sie den Stil mit den für das Steuerelement festgelegten VisualStates. Es müsste Ihre eigenen VisualStates für die Steuerelemente schreiben, die Sie ändern möchten, und dann manuell wechseln. Habe es noch nie probiert, also weiß ich nicht, wie zuverlässig dieser Weg sein könnte. Es scheint der beste Weg im Falle einer Performance zu sein (nur Annahme), aber die VisualStates von Hand für jedes Steuerelement zu halten, muss möglicherweise einen eigenen VisualStateManager implementieren und Probleme verursachen, wenn Sie das richtige VisualState zum gewünschten Zeitpunkt beibehalten.

+0

Brilliant - vielen Dank. Mehr als genug, um es zu einer soliden Antwort zu erklären! – RCairns