Pregunta

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

Estoy intentando ...

myStory.Stop(this);

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

He intentado

.Remove(this);

y lo intenté

.Seek(TimeSpan.Zero); 

que tampoco funcionó.

Más detalles ... Aquí está mi ejemplo de 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>

Entonces, el texto en el textone se ejecuta, y si cierra la pantalla y regresa a la pantalla rápidamente, el texto dos, en realidad se reproduce sobre un guión gráfico recién iniciado. Por lo tanto, el guión gráfico original (desde la primera pantalla) todavía está funcionando, aunque lo eliminé y lo detuve.

¿Fue útil?

Solución

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

Comenté que también debe asegurarse de que la propiedad IsControllable esté establecida en true. ¡Tenlo en cuenta!

Storyboard.Seek method

Otros consejos

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

  

Este método cambia el reloj del objetivo   CurrentState a Stopped.

     

Un reloj detenido puede reiniciarse   usando el comienzo, la búsqueda o   Método SeekAlignedToLastTick.

Lo siento Scott, no estaba prestando atención. ¿Intentaste configurar el FillBehavior en el Storyboard? Establecer el FillBehavior en Stop restablece la animación. Sin embargo, no estoy seguro de por qué Stop no lo hace ...

<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;

luego crea un nuevo guión gráfico

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

el storyboard " storyboard_name " comenzará.

si desea detener el guión gráfico, intente así

storyboard_name.Stop();

si desea eliminar el storyboard. intente así

storyboard_name.Remove();

otros detalles pueden ser:

this.MyAnimation.FillBehavior = FillBehavior.Stop;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top