2011-01-18 12 views
8

Tengo varios botones tipo palanca que deseo pulsar al unísono cuando estoy presionado.Sincronizar WPF ColorAnimation en varios controles

He definido un estilo con un disparador que inicia la animación de brillo y esto funciona bien, aparte de que cada botón pulsa asincrónicamente de los demás.

¿Cómo puedo hacer que cada botón sincronice su pulso con los demás?

Aquí es el estilo:

<Storyboard x:Key="pulseStory"> 
    <ColorAnimation                  
     Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)" 
        From="Red" 
        To="Transparent" 
        Duration="0:0:1" /> 
</Storyboard> 

<Style x:Key="pulseButton" TargetType="Button"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Self}}" Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard Storyboard="{StaticResource pulseStory}"/> 
      </DataTrigger.EnterActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Salud!

Respuesta

4

bien ... Voy a tomar una puñalada en este ...

El marco WPF no tiene ninguna instalación para la sincronización de animaciones que se ejecutan simultáneamente, por lo que van a tener que llegar con un método diferente. Una idea viene a la mente ...

Anima una propiedad de color de un elemento UI oculto dentro de tu guión gráfico, luego utiliza el enlace UI (es decir, enlaces de ElementName) para conectar el Color de cada uno de tus botones a este elemento UI oculto.

+1

Ese es el camino que he tomado: grandes mentes ... :) –

+0

Genial, todo lo que necesitas son 17 horas y puedes responder tus propias preguntas ;-) ¡Intentaré ser un poco más rápido la próxima vez! – ColinE

1

En realidad, deberías estar haciendo esto a través de un recurso, al menos usar un control oculto es demasiado complicado para mí personalmente.

lo que hay que cumplir para que funcione:

  1. La propiedad se enlaza a las necesidades para ser una propiedad de dependencia, por lo tanto, el objeto envolvente debe ser un DependencyObject.
  2. Tienes que hacer referencia al objeto como un recurso estático (en contraposición a un recurso dinámico) así:
<DoubleAnimation 
    Storyboard.Target="{StaticResource AnimationValue}" 
    Storyboard.TargetProperty="(local:WrappedValue.Value)" 
    To="0" Duration="0:0:1"/> 

Bueno, es cierto que es un poco hacky así tener una clase de contenedor para esto, pero es más limpio que un control total (si desea utilizar controles, puede utilizar un poco de Tag -propiedad, por ejemplo, del contenedor que aloja todos sus controles)

+0

No he pensado en esto; también lo intentaré. –

Cuestiones relacionadas