web-dev-qa-db-fra.com

Définir une ressource statique dans le code

J'ai quelques styles dans mon fichier App.xaml:

<SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
<SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
<SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
<SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
<SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>

<Style x:Key="stackpanelBackground" TargetType="StackPanel">
    <Setter Property="Background" Value="{StaticResource styleBlue}"/>
</Style>

Je veux changer la BackgroundProperty dans le code de mon mainpage.xaml.cs.

J'ai essayé d'utiliser ceci:

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

Mais je reçois une exception d'échec catastrophique. Je pense que cela a à voir avec {StaticResource styleRed}. Y a-t-il une meilleure manière de faire cela?

17
Arn Vanhoutte

Pourquoi modifiez-vous le style au lieu de définir directement la propriété Background- de votre StackPanel ciblée? Puisqu'une «valeur locale» a une priorité supérieure à celle de «modificateurs de style», la valeur que vous écrivez dans Background à partir du code précédent est utilisée

Veux dire: 

(1) Donnez un nom à votre stackpanel x:Name="spBla"

(2) Affectez le pinceau à la Background de spBla (quelque chose comme spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;)

Vous pouvez en apprendre plus sur la priorité des valeurs ici:

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

9
Benj

Si je comprends bien, vous souhaitez définir un style vous permettant de ne modifier que des panneaux de pile spécifiques, afin de ne pas avoir à les définir tous. Essayez cette suggestion (remarque: c'est une suggestion et je ne l'ai pas testée, mais j'espère que c'est dans la bonne direction)

<SolidColorBrush x:Key="styleBlue" Color="#FF4B77BE"/>
<SolidColorBrush x:Key="styleRed" Color="#FFF64747"/>
<SolidColorBrush x:Key="styleOrange" Color="#FFF89406"/>
<SolidColorBrush x:Key="styleGreen" Color="#FF1BBC9B"/>
<SolidColorBrush x:Key="styleYellow" Color="#FFF9BF3B"/>

<Style x:Key="stackpanelBackground" TargetType="StackPanel">
    <Setter Property="Background" Value="{Binding Background, FallbackValue={StaticResource styleBlue}}"/>
</Style>

Ou essayez TemplateBinding au lieu de Binding, comme je l'ai dit c'est une suggestion et je ne l'ai pas testée. Cela vous donnerait une liaison pour l'arrière-plan et une valeur de secours pour un stackpanel pour lequel vous n'avez pas défini de couleur d'arrière-plan. Faites-moi savoir comment ou si cela fonctionne pour vous :)

0
trippedOverXaml