2011-04-19 19 views
12

En WPF toolkit datagrid Tengo un desencadenador de datos vinculado a la opacidad del elemento de celda.WPF. ¿Cómo detener la animación de activación de datos a través del enlace?

Cuando UpVisibility cambia a 1, la ruta se vuelve visible y la animación comienza a desvanecerse a 0. Lo que funciona.

Sin embargo, mi problema ahora - si necesito para detener prematuramente/cancelar la decoloración y pongo UpVisibility a 0 el camino es aún visible y la decoloración que no pasó nada ....

cómo abandonar la opacidad a 0 al instante usando el objeto MyValue?

<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0"> 
    <Path.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Path.Style> 
</Path> 

Respuesta

7

Ha intentado algo como esto (ejemplo no probado):

<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0"> 
    <Path.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
        <DataTrigger.ExitActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.0" Duration="0:0:0" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.ExitActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Path.Style> 
</Path> 

He establecido la duración de la animación de 0 a ser instantánea. Y si no define la propiedad Desde, le indica a WPF que comience con el valor actual de DependencyProperty, por lo que la transición será fluida.

+0

funciona. gracias –

12

Los guiones gráficos también se pueden detener utilizando el ExitAction en un DataTrigger, que se invoca cuando el valor encuadernado cambia fuera del estado de destino. Sólo dar su BeginStoryboard un nombre, y hacer referencia a ella en una acción StopStoryboard, así:

<DataTrigger.EnterActions> 
    <BeginStoryboard Name="your_storyboard_name"> 
     ... 
    </BeginStoryboard> 
</DataTrigger.EnterActions> 

<DataTrigger.ExitActions> 
    <StopStoryboard BeginStoryboardName="your_storyboard_name" /> 
</DataTrigger.ExitActions> 

Esto puede ser más apropiada que la de iniciar un segundo guión gráfico para detener o enmascarar un guión diferente.

0

Si es necesario restablecer la animación en código detrás se suele hacer tales llamadas:

MyControl.BeginAnimation(OpacityProperty, null); 

Pero cómo hacerlo en XAML acuerdo con MVVM? La respuesta es:

<Style> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Vanishing}" Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard TargetProperty="Opacity"> 
         <DoubleAnimation To="0" Duration="0:0:0.5" FillBehavior="Stop"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
       <BeginStoryboard> 
        <Storyboard TargetProperty="Opacity"> 
         <DoubleAnimation To="{x:Null}" Duration="0:0:0"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Para llamar a la animación en modelo de vista que podemos hacer:

Vanishing = true; 
await Task.Delay(500); 
Vanishing = false; 

También asegúrese de que la propiedad de unión (fuga en mi caso) llama INotifyPropertyChanged para notificar vista sobre el nuevo valor

Cuestiones relacionadas