2009-05-07 6 views
8

Qual è il modo corretto di interrompere e riavviare uno storyboard dal codice .net?Riavvio di uno storyboard WPF

sto cercando ...

myStory.Stop(this); 

Prevedendo che una chiamata successiva a .Begin (questo); ricomincerebbe dalla timeline a zero, ma invece, lo storyboard riprende proprio dove è stato fermato.

ho cercato

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

Così il testo nella Textone corre, e se si chiude la schermata e tornare alla schermata in fretta, il texttwo, in realtà viene riprodotta per uno storyboard appena avviato. Quindi lo storyboard originale (dalla prima schermata) è ancora in riproduzione e viene riprodotto, anche se l'ho rimosso e interrotto.

+0

forse è il mio setup. Ecco un po 'più di informazioni. Ho una classe di base con una proprietà storyboard storyOverlay. Nel ctor di una classe figlia, faccio una storyOverlay = TryFindResource ("storyId") come Storyboard; poi, sto controllando se storyOVerlay! = Null; {storyOverlay.Remove (this); } Questo cambia qualcosa? – ScottCate

risposta

8

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

Ho commentato che è necessario assicurarsi che la proprietà IsControllable sia impostata su true. Tienilo a mente!

Storyboard.Seek method

+0

Inoltre, è necessario assicurarsi che IsControllable sia impostato su true e che l'oggetto contenitore appropriato sia contrassegnato. – Rob

+0

Grazie! Questo è ESATTAMENTE quello che cercavo !!!! – ScottCate

3

È necessario eseguire myStory.Remove (this) prima di chiamare myStory.Begin (this) per riavviarlo da capo. Questo perché chiamare Storyboard :: Stop interrompe semplicemente gli orologi di animazione, ma li lascia intatti. Una chiamata successiva per iniziare, agirà semplicemente come un curriculum. Sono d'accordo che questo è un po controintuitivo, ma se si legge la documentazione ClockController::Stop, si vedrà il seguente nel commento:

Questo metodo cambia CurrentState dell'orologio bersaglio per Stopped.

Un orologio arrestato può essere riavviato da utilizzando il metodo Begin, Seek o SeekAlignedToLastTick.

+0

Mi sembra giusto. –

+0

questo non funziona ancora per me. dopo che ho sia myStory.Remove (this) che myStory.Stop (this), se la scena ritorna sullo schermo, prima che lo storyboard sia finito, lo storyboard dell'ultimo (forse meglio chiamarlo originale) è ancora in riproduzione. – ScottCate

0

dispiace Scott, non stava prestando attenzione. Hai provato a impostare il FillBehavior sullo Storyboard. Imposta il FillBehavior su Stop ripristina l'animazione. Non certo perché arresto non lo fa però ...

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; 

quindi creare nuovi "storyboard_name" storyboard

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

storyboard inizierà.

se si desidera interrompere lo storyboard.Si prega di provare come questo

storyboard_name.Stop(); 

se si desidera rimuovere lo storyboard.please provare come questo

storyboard_name.Remove(); 
-1

altri dettagli possono essere:

this.MyAnimation.FillBehavior = FillBehavior.Stop;