2008-08-21 25 views
42

tengo algo como esto:Cómo detener una animación en C#/WPF?

 
barProgress.BeginAnimation(RangeBase.ValueProperty, new DoubleAnimation(
    barProgress.Value, dNextProgressValue, 
    new Duration(TimeSpan.FromSeconds(dDuration))); 

Ahora, ¿cómo dejar que la animación (la DoubleAnimation)? La razón por la que quiero hacer esto es porque me gustaría comenzar nuevas animaciones (esto parece funcionar, pero es difícil de decir) y finalmente detener la última animación ...

Respuesta

69

Para detenerlo, llame a BeginAnimation nuevamente con el segundo argumento establecido en nulo.

+6

tener cuidado. Esto no funciona si especifica HandoffBehavior.Compose. Consulte http://msdn.microsoft.com/en-us/library/ms590757%28v=VS.90%29.aspx para obtener más información.Preste atención al doco para el parámetro de animación. – LukeN

+0

Llamar a 'BeginAnimation' por segunda vez no parece detener el" reloj "de Animación de la primera animación. Después del tiempo especificado, la animación genera el evento 'Completed'. No se plantea directamente al llamar a 'BeginAnimation', sino cuando la animación * hubiera terminado *. – BatteryBackupUnit

4

Coloque la animación en una StoryBoard. Llame a Begin() y Stop() en el guión gráfico para comenzar a detener las animaciones.

28

Al utilizar guiones para controlar una animación, asegúrese de configurar el segundo parámetro en true con el fin de establecer la animación como controlable:

public void Begin(
    FrameworkContentElement containingObject, 
    **bool isControllable** 
) 
+4

¡Además de uno para ti, me preguntaba por qué mi animación no respondía a "Parar"! – Joon

+2

Sí, sí, sí, esto lo hizo. Ese "verdadero" desaparecido me estaba volviendo loco :) –

+1

¡eres una leyenda! ¡Esto me estaba volviendo loco! –

7

Si desea que el valor base para convertirse en la efectiva valor de nuevo, debe detener la animación de influir en la propiedad. Hay tres maneras de hacer esto con animaciones de guión gráfico:

  • Establecer propiedad FillBehavior de la animación para detener
  • quite todo el Storyboard
  • Retire la animación de la propiedad individual

De MSDN

How to: Set a Property After Animating It with a Storyboard

7

En mi caso tuve que usar dos comandos, mi xaml tiene un botón que dispara un disparador, y su disparador dispara la animación del guión gráfico.

He puesto un botón para detener la animación con el código detrás:

MyBeginStoryboard.Storyboard.Begin(this, true); 
MyBeginStoryboard.Storyboard.Stop(this); 

no me gusta, pero realmente funciona aquí. ¡Darle una oportunidad!

+2

Recuerde llamar a Storyboard.Remove (this) también, o puede perder memoria ya que su FrameworkElement guardará una referencia al guión gráfico. Acabo de encontrar una instancia en mi código donde simplemente detener y reemplazar la animación dejó más de 4000 animaciones enraizadas después de ejecutarse durante algunas semanas. – LukeN

14

Hay dos maneras de detener una BeginAnimation. El primero es llamar a BeginAnimation nuevamente con el segundo parámetro establecido en null. Esto eliminará todas las animaciones en la propiedad y revierte el valor a su valor base.

Según cómo utilice ese valor, puede que este no sea el comportamiento que desea. La segunda forma es establecer las animaciones BeginTime en null y luego llamar a BeginAnimation con él. Esto eliminará esa animación específica y dejará el valor en su posición actual.

DoubleAnimation myAnimation = new Animation(); 
// Initialize animation 
... 

// To start 
element.BeginAnimation(Property, myAnimation); 

// To stop and keep the current value of the animated property 
myAnimation.BeginTime = null; 
element.BeginAnimation(Property, myAnimation); 
+0

Estoy de acuerdo. Esto responde la pregunta, se aplica específicamente a la solicitud de OP para Animaciones, no a Storyboard, y brinda dos buenas opciones. – Grim

0

Puede utilizar este código:

[StoryBoardName].Remove([StoryBoardOwnerControl]); 
4
<Trigger.EnterActions> 
     <BeginStoryboard x:Name="myStory"> 
     ......... 
     </BeginStoryboard> 
</Trigger.EnterActions> 
<Trigger.ExitActions> 
     <StopStoryboard BeginStoryboardName="myStory"/> 
</Trigger.ExitActions> 
+2

StopStoryBoard no es compatible con un proyecto de Windows Presentation Foundation (WPF) –

Cuestiones relacionadas