2010-09-29 27 views
14

¿Hay alguna manera de cambiar (y aplicar) un estilo dinámicamente en WPF?Cambiar un estilo dinámicamente en WPF

Decir que tengo el estilo declarada 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> 
  1. En un momento, necesito cambio el color Pink, a, digamos Green, y todas las líneas con estilo MyLineStyleKey se convirtió en verde . Una línea es rosada cuando se lanza, y azul cuando se selecciona ... Ahora, necesitaba cambiar la propiedad no seleccionada (rosa a verde) ..., así que esto no es solo configurarlo en otro color, el disparador (selección> azul) ya no funcionará ... ¿Es eso posible? ¿Cómo?

  2. ¿Es posible vincular al color rosa en el estilo, por ejemplo, a un fondo de botón, que reflejará el color de estilo utilizado actualmente?

EDIT:
Para Probé:

Style s = (Style)this.Resources["MyLineStyleKey"]; 

(s.Setters[0] as Setter).Value = background; 
(s.Setters[1] as Setter).Value = background; 

pero una excepción ocurrió:

Después de un 'SetterBase' está en uso (sellado), se no puede ser modificado

+0

Eso se puede hacer de forma dinámica. – Wernight

Respuesta

23

crear un pincel como un recurso

<SolidColorBrush x:Key="MyFillBrush" Color="Pink" /> 

y se refieren a que 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 en chan ge el color de todas las formas que utilizan el estilo "MyShapeStyle", puede hacer lo siguiente de 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 este trabajo es el hecho de que utiliza un DynamicResource para la referencia de cepillo en su estilo: esto le dice a WPF que monitoree ese recurso para ver los cambios. Si usa un StaticResource, no obtendrá este comportamiento.

+0

Una pregunta: ¿Puedo pasar un dynamicBrush? a un usuario WPFControl? – serhio

+0

No sé lo que quiere decir con "Pase", pero ciertamente puede hacer referencia a él desde su control de usuario, incluso si se define en un control más arriba en la jerarquía (como en la ventana). –

+0

Esta solución puede resolver el problema, pero no responde exactamente la pregunta formulada – peter70

15

Un estilo solo se puede modificar antes de su primer uso. De MSDN:

Un estilo se sella cuando se basa otro estilo o cuando se aplica por primera vez.

En su lugar, se podría crear un nuevo estilo basado en su estilo existente, y anular las propiedades que desee:

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)); 
+0

oh ... Tengo un estilo con un gatillo ... Una línea era rosa cuando se soltó, y azul cuando se seleccionó ... Ahora, necesitaba cambiar la propiedad no seleccionada ..., así que esto no es solo configurarlo para otro color, el disparador (selección> Azul) ya no funcionará ... – serhio

+0

actualizó la pregunta con detalles .. – serhio

+0

hm ...Supongo que si separe todas las líneas del estilo, no podré modificarlo, una vez utilizado ... – serhio

Cuestiones relacionadas