c# - Establecer recurso estático en código
wpf xaml (3)
Tengo algunos estilos en mi archivo 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>
Quiero cambiar la BackgroundProperty
de BackgroundProperty
en el código de mi mainpage.xaml.cs
.
Intenté usar esto:
Style style = Application.Current.Resources["stackpanelBackground"] as Style;
style.Setters.SetValue(StackPanel.BackgroundProperty, "{StaticResource styleRed}");
Pero me sale una excepción de fallo catastrófico. Creo que tiene que ver con {StaticResource styleRed}
. ¿Hay una mejor manera de hacer esto?
¿Por qué está modificando el estilo en lugar de configurar la propiedad de Background
de su StackPanel
objetivo directamente? Dado que un ''Valor local'' tiene una prioridad más alta que ''Establecedores de estilo'', se usará el valor que escriba en el Background
desde el código subyacente
Medio:
(1) Asigne un nombre a su panel de pila x:Name="spBla"
(2) Asigne el pincel al Background
de spBla
(algo como spBla.Background=Application.Current.Resources["styleRed"] as SolidColorBrush;
)
Puede aprender más sobre la precedencia de valores aquí:
http://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx
Si comprendo correctamente, desea configurar un estilo que le permita cambiar solo los paneles de pilas específicos, por lo que no tiene que configurarlos todos. Prueba esta sugerencia (nota: es una sugerencia y no la he probado, pero espero que esté en la dirección correcta)
<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>
O pruebe TemplateBinding en lugar de Binding, como dije que es una sugerencia y no la he probado. Esto le daría un enlace para el fondo, y un valor de reserva para un panel de apilamiento para el que no ha establecido un color de fondo. Déjame saber cómo o si esto funciona para ti :)
Un StaticResource
es estático. No puedes cambiarlos una vez que la aplicación haya compilado.
Para este propósito, hay DynamicResource
:
Un DynamicResource creará una expresión temporal durante la compilación inicial y, por lo tanto, aplazará la búsqueda de recursos hasta que el valor del recurso solicitado sea realmente necesario para construir un objeto.
También tenga en cuenta que puede encontrar mejor la referencia al otro recurso utilizando FindResource
. Intente algo como esto (muestra de trabajo completa):
En MainPage.xaml
:
<Window.Resources>
<Color R="255" x:Key="styleRed" />
<Style x:Key="abc" TargetType="StackPanel">
<Setter Property="Background" Value="Blue" />
</Style>
</Window.Resources>
En 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;
}
}