Domanda

Qual è il modo corretto per arrestare e riavviare uno storyboard dal codice .net?

Sto provando ...

myStory.Stop(this);

Aspettando che una chiamata successiva a .Begin (questo); si riavvierebbe dalla linea temporale a zero, ma invece lo storyboard riprende esattamente da dove era stato interrotto.

Ho provato

.Remove(this);

e ho provato

.Seek(TimeSpan.Zero); 

che inoltre non ha funzionato.

Maggiori dettagli ... Ecco il mio esempio di storyboard.

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

Quindi il testo nel textone viene eseguito e se chiudi lo schermo e ritorni rapidamente allo schermo, il testo due, in realtà, viene riprodotto su uno storyboard appena avviato. Quindi lo storyboard originale (dalla prima schermata) è ancora in giro e in riproduzione, anche se l'ho rimosso e l'ho interrotto.

È stato utile?

Soluzione

Che dire dell'utilizzo di Storyboard.Seek (TimeSpan.Zero)? Simile alla ricerca in uno stream, questo dovrebbe riportarti all'inizio dell'animazione.

Ho commentato che dovresti anche assicurarti che la proprietà IsControllable sia impostata su true. Tienilo a mente!

Storyboard.Seek method

Altri suggerimenti

Dovresti fare myStory.Remove (questo) prima di chiamare myStory.Begin (questo) per farlo ricominciare da zero. Questo perché chiamare Storyboard :: Stop interrompe semplicemente gli orologi di animazione, ma li lascia intatti. Una successiva chiamata a Begin fungerà semplicemente da curriculum. Sono d'accordo che ciò sia in qualche modo controintuitivo, tuttavia se leggi la documentazione ClockController :: Stop , vedrai quanto segue nelle note:

  

Questo metodo cambia l'orologio target   CurrentState su Stopped.

     

Un orologio arrestato può essere riavviato da   usando Begin, Seek o   Metodo SeekAlignedToLastTick.

Scusa Scott, non stavo prestando attenzione. Hai provato a impostare FillBehavior sullo Storyboard. Impostare FillBehavior su Stop ripristina l'animazione. Non so perché Stop non lo faccia però ...

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

quindi crea nuovo storyboard

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

lo storyboard " storyboard_name " inizierà.

se vuoi fermare lo storyboard. per favore prova così

storyboard_name.Stop();

se si desidera rimuovere lo storyboard. provare in questo modo

storyboard_name.Remove();

altri dettagli possono essere:

this.MyAnimation.FillBehavior = FillBehavior.Stop;

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top