I have a few styles in my App.xaml
file:
<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>
I want to change the BackgroundProperty
in the code of my mainpage.xaml.cs
.
I tried using this:
Style style = Application.Current.Resources["stackpanelBackground"] as Style;
style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}");
But I get a catastrophic failure exception. I think it has to do with {StaticResource styleRed}
. Is there a better way to do this?
A StaticResource
is static. You can't change them once the application has compiled.
For this purpose, there is DynamicResource
:
A DynamicResource will create a temporary expression during the initial compilation and thus defer lookup for resources until the requested resource value is actually required in order to construct an object.
Also note that you can find the reference to the other resource better using FindResource
. Try something like this (full working sample):
In MainPage.xaml
:
<Window.Resources>
<Color R="255" x:Key="styleRed" />
<Style x:Key="abc" TargetType="StackPanel">
<Setter Property="Background" Value="Blue" />
</Style>
</Window.Resources>
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;
}
}