2009-05-07 13 views
8

¿Cuál es la forma correcta de detener y reiniciar un guión gráfico desde el código .net?Reiniciar un guion gráfico WPF

Estoy intentando ...

myStory.Stop(this); 

la espera de que una llamada posterior a .Begin (this); se reiniciaría desde la línea de tiempo en cero, pero en su lugar, el guión gráfico se inicia justo donde se detuvo.

He tratado

.Remove(this); 

y yo intentado

.Seek(TimeSpan.Zero); 

que tampoco funciona.

Más detalles ... Aquí está mi ejemplo del guión gráfico.

<Storyboard x:Key="overlay"> 
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="textone" Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="0"/> 
     <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="1"/> 
     <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="1"/> 
     <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="0"/> 
    </DoubleAnimationUsingKeyFrames> 
    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="texttwo" Storyboard.TargetProperty="(UIElement.Opacity)"> 
     <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="0"/> 
     <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="1"/> 
     <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="1"/> 
     <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="0"/> 
    </DoubleAnimationUsingKeyFrames> 
</Storyboard> 

lo tanto, el texto en el TextOne corre, y si se cierra la pantalla y vuelve a la pantalla rápidamente, el texttwo, realmente juega sobre un guión de reciente creación. Entonces, el guión gráfico original (de la primera pantalla) todavía está disponible y sonando, aunque lo haya eliminado, y lo haya detenido.

+0

tal vez es mi configuración. Aquí hay un poco más de información. Tengo una clase base con una propiedad storyboard storyOverlay. En el ctor de una clase para niños, hago un storyOverlay = TryFindResource ("storyId") como Storyboard; luego, estoy comprobando si storyOVerlay! = Null; {storyOverlay.Remove (this); } ¿Eso cambia algo? – ScottCate

Respuesta

8

¿Qué pasa con el uso de Storyboard.Seek (TimeSpan.Zero)? Similar a buscar en un Stream, esto debería llevarlo al comienzo de la animación.

Comenté que también debería asegurarse de que la propiedad IsControllable esté establecida en verdadero. ¡Mantenlo en mente!

Storyboard.Seek method

+0

Además, debe asegurarse de que IsControllable esté establecido en verdadero y que el objeto que lo contiene esté marcado. – Rob

+0

¡Gracias! ¡Esto es EXACTAMENTE lo que estaba buscando! – ScottCate

3

Tendría que hacer myStory.Remove (esto) antes de llamar a myStory.Begin (esto) para que comience desde cero. Esto se debe a que llamar a Storyboard :: Stop simplemente detiene los relojes de animación, pero los deja intactos. Una llamada posterior para Comenzar, simplemente actuará como un currículum. Estoy de acuerdo en que esto es poco intuitivo, sin embargo si usted lee la documentación ClockController::Stop, verá lo siguiente en los comentarios:

Este método cambia CurrentState del reloj de destino a Detenido.

Un reloj detenido se puede reiniciar mediante utilizando el método Begin, Seek o SeekAlignedToLastTick.

+0

Suena bien para mí. –

+0

esto todavía no funciona para mí. después de que ambos myStory.Remove (this) y myStory.Stop (this), si la escena vuelve a aparecer en la pantalla, antes de que el storyboard haya terminado, el último guión gráfico (tal vez mejor para llamarlo Original) aún se está reproduciendo. – ScottCate

0

Lo sentimos Scott, yo no estaba prestando atención. ¿Intentó establecer FillBehavior en el guión gráfico? Establezca FillBehavior en Detener restablece la animación. No sé por qué la parada no lo hace, aunque ...

0
<Storyboard x:Key="overlay"> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="textone" Storyboard.TargetProperty="(UIElement.Opacity)"> 
    <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="00:00:03.0" Value="1"/> 
    <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="1"/> 
    <SplineDoubleKeyFrame KeyTime="00:00:06.0" Value="0"/> 
</DoubleAnimationUsingKeyFrames> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="texttwo" Storyboard.TargetProperty="(UIElement.Opacity)"> 
    <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="00:00:07.0" Value="1"/> 
    <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="1"/> 
    <SplineDoubleKeyFrame KeyTime="00:00:10.0" Value="0"/> 
</DoubleAnimationUsingKeyFrames> 

using System.Windows.Media.Animation; 

continuación, crear nuevas "storyboard_name" guión gráfico

Storyboard storyboard_name = (Storyboard)(FindResource("overlay")); 
storyboard_name.Begin(); 

el guión gráfico se iniciará.

si desea detener el guión gráfico.por favor trate como esto

storyboard_name.Stop(); 

si desea eliminar el storyboard.please tratar la misma familia

storyboard_name.Remove(); 
-1

otros detalles pueden ser:

this.MyAnimation.FillBehavior = FillBehavior.Stop;

Cuestiones relacionadas