español - Cambiar un estilo dinámicamente en WPF
wpf vs winforms (2)
Crea un pincel como recurso.
<SolidColorBrush x:Key="MyFillBrush" Color="Pink" />
y refiérase a eso en su estilo
<Style x:Key="MyShapeStyle" TargetType="Shape">
<Setter Property="Fill" Value="{DynamicResource MyFillBrush}" />
</Style>
...
<!-- Then further down you may use it like this -->
<StackPanel Width="100">
<Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
<Rectangle Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
<Ellipse Style="{StaticResource MyShapeStyle}" Height="50" Margin="8" />
<Button Content="Click to change color" Click="Button_Click" Margin="8" />
</StackPanel>
Ahora, para cambiar el color de todas las formas que usan el estilo "MyShapeStyle", puede hacer lo siguiente desde su código subyacente:
private void Button_Click(object sender, RoutedEventArgs e)
{
Random r = new Random();
this.Resources["MyFillBrush"] = new SolidColorBrush(Color.FromArgb(
0xFF,
(byte)r.Next(255),
(byte)r.Next(255),
(byte)r.Next(255)));
}
Lo que hace que esto funcione es el hecho de que utiliza un DynamicResource
para la referencia de pincel en su estilo; esto le indica a WPF que supervise ese recurso para DynamicResource
cambios. Si usa un StaticResource
en StaticResource
lugar, no obtendrá este comportamiento.
¿Hay una manera de cambiar (y aplicar) un estilo dinámicamente en WPF?
Digamos que tengo el estilo declarado en XAML:
<Style TargetType="local:MyLine"
x:Key="MyLineStyleKey" x:Name="MyLineStyleName">
<Setter Property="Fill" Value="Pink"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter Property="Fill" Value="Blue" />
</Trigger>
</Style.Triggers>
</Style>
En un momento, necesito cambiar el color
Pink
, a, digamosGreen
, y todas las líneas con estiloMyLineStyleKey
seMyLineStyleKey
verdes. Una línea es Rosa cuando se libera, y Azul cuando se selecciona ... Ahora, necesito cambiar la propiedad no seleccionada (Rosa a Verde) ..., así que esto no es solo configurarlo en otro color, el disparador (selección> Azul ) no funcionará más ... ¿Es eso posible? ¿Cómo?¿Es posible vincularlo al color rosa en el estilo, por ejemplo, a un fondo de botón, que reflejará el color del estilo utilizado actualmente?
EDITAR:
Para 1 lo intenté:
Style s = (Style)this.Resources["MyLineStyleKey"];
(s.Setters[0] as Setter).Value = background;
(s.Setters[1] as Setter).Value = background;
pero ocurrió una excepción:
Después de que un ''SetterBase'' está en uso (sellado), no se puede modificar.
Un estilo solo puede ser modificado antes de su primer uso. Desde MSDN:
Un estilo se sella cuando otro estilo se basa en él o cuando se aplica por primera vez.
En su lugar, puede crear un nuevo estilo basado en su estilo existente y anular las propiedades que desea:
Style newStyle = new Style();
newStyle.BasedOn = originalStyle;
newStyle.TargetType = typeof(MyLine);
Brush blue = new SolidColorBrush(Colors.Blue);
newStyle.Setters.Add(new Setter(Shape.FillProperty, blue));
newStyle.Setters.Add(new Setter(Shape.StrokeProperty, blue));