Imposta la risorsa statica nel codice

Ho alcuni stili nel mio file App.xaml :

         

Voglio cambiare la proprietà BackgroundProperty nel codice del mio mainpage.xaml.cs .

Ho provato ad usare questo:

 Style style = Application.Current.Resources["stackpanelBackground"] as Style; style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}"); 

Ma ottengo un’eccezione di fallimento catastrofico. Penso che abbia a che fare con {StaticResource styleRed} . C’è un modo migliore per farlo?

Una StaticResource statica è statica. Non è ansible cambiarli una volta che l’applicazione è stata compilata.

A tale scopo, c’è DynamicResource :

Un DynamicResource creerà un’espressione temporanea durante la compilazione iniziale e quindi rinvierà la ricerca delle risorse fino a quando il valore della risorsa richiesto non è effettivamente necessario per build un object.

Si noti inoltre che è ansible trovare il riferimento all’altra risorsa meglio utilizzando FindResource . Prova qualcosa di simile a questo (esempio funzionante completo):

In MainPage.xaml :

     

In MainPage.xaml.cs :

 Style style = this.FindResource("abc") as Style; var r = this.FindResource("styleRed"); foreach (Setter s in style.Setters) { if (s.Property == StackPanel.BackgroundProperty) { s.Value = r; } } 

Perché stai modificando lo stile invece di impostare direttamente la proprietà Background -Proprietà dello StackPanel destinazione? Poiché un “valore locale” ha una precedenza più alta di “setter di stile”, verrà utilizzato il valore che scrivi in Background dal codice sottostante

Si intende:

(1) Dai un nome al tuo stackpanel x:Name="spBla"

(2) Assegna il pennello allo Background di spBla (qualcosa come spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush; )

Puoi saperne di più sulla precedenza dei valori qui:

http://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx

Se ho capito bene, vuoi impostare uno stile che ti permetta di cambiare solo specifici pannelli dello stack, quindi non devi impostarli tutti. Prova questo suggerimento (nota: è un suggerimento e non l’ho provato, ma spero che sia nella giusta direzione)

       

Oppure prova TemplateBinding anziché Binding, come ho detto è un suggerimento e non l’ho testato. Ciò ti darà un vincolo per lo sfondo e un valore di fallback per un pannello di stack per il quale non hai impostato un colore di sfondo. Fammi sapere come e se questo funziona per te 🙂