2012-04-27 18 views
7

Quiero poder establecer propiedades de estilo (y valores) desde el archivo .cs en mi ventana WPF.Cambiando el estilo XAML dinámicamente en Code Behind para que los controles que apliquen ese estilo también reflejen el cambio

Mi problema es si tengo 30 rectángulos, todos los cuales quiero que tengan el mismo estilo (y no quiero actualizarlos todos individualmente). Me gustaría tenerlos a todos listos (en el archivo xaml) con el mismo estilo, y luego actualizar el estilo para que se vea de la manera que me gustaría.

Digamos que establecí el Style = "key1" en el Xaml para cada rectángulo. Entonces quiero poder modificar "key1" más tarde para que todos los rectángulos reflejen ese cambio.

me trataron en App.xaml

<Application.Resources> 
    <Style x:Key="key1" TargetType="Rectangle"> 
     <Setter Property="Fill" Value="Red"/> 
    </Style> 
</Application.Resources> 

En MainwWindows.xaml

<StackPanel> 
    <Rectangle Style="{StaticResource key1}" Height="200" Width="200" x:Name="rect1"/> 
    <Button Click="Button_Click" Content="Click"/> 
</StackPanel> 

En código detrás

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    Style style = Application.Current.Resources["key1"] as Style; 
    style.Setters.Add(new Setter(Rectangle.VisibilityProperty, Visibility.Collapsed)); 
} 

Esto actualiza el estilo pero no se actualizan los rectángulos.

¿Esto es posible? ¿Alguien sabe como hacer esto? (Un ejemplo sería muy apreciado).

+0

Creo que tiene que llamar a los métodos 'Update()' o 'Refresh()' en los elementos de la IU (solo ventana completa o rectángulo). pruébalo, puede ser que esto pueda ayudar. – stukselbax

Respuesta

10

Debe usar DynamicResource para poder cambiarlo en tiempo de ejecución. También necesita reemplazar el estilo con uno nuevo, no intente modificar el existente. Esto funciona:

<StackPanel> 
    <Rectangle Style="{DynamicResource key1}" Height="200" Width="200" x:Name="rect1"/> 
    <Button Click="Button_Click" Content="Click"/> 
</StackPanel> 

Style style = new Style {TargetType = typeof(Rectangle)}; 
style.Setters.Add(new Setter(Shape.FillProperty, Brushes.Red)); 
style.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed)); 

Application.Current.Resources["key1"] = style; 
2

También vale la pena mencionar que los estilos se sellan una vez utilizados y, por lo tanto, no se pueden cambiar. Esta es la razón por la cual los estilos deben ser reemplazados por otra instancia en lugar de actualizarse.

Cuestiones relacionadas