Pergunta
O que é a maneira correta de parar e reiniciar um storyboard de código .net?
Eu estou tentando ...
myStory.Stop(this);
Esperando que uma chamada subsequente para .Begin (this); iria reiniciar a partir do cronograma em zero, mas em vez disso, o storyboard começa exactamente onde parou.
Eu tentei
.Remove(this);
e eu tentei
.Seek(TimeSpan.Zero);
que também não funcionou.
Mais detalhes ... Aqui é minha amostra 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>
Assim, o texto nos textone corridas, e se você fechar a tela, e retornar para a tela rapidamente, o texttwo, realmente desempenha ao longo de um storyboard recém-iniciado. Assim, o original (a partir da primeira tela) storyboard é ainda ao redor e jogar, embora eu tenha removido, e parou.
Solução
Que tal usar Storyboard.Seek (TimeSpan.Zero)? Semelhante ao que procuram em um Stream, isso deve trazer de volta para o início da animação.
eu comentei que você também deve certificar-se de que a propriedade IsControllable é definido como verdadeiro. Tenha isso em mente!
Outras dicas
Você precisa fazer myStory.Remove (isso) antes de chamar myStory.Begin (this) para tê-lo começar de novo a partir do zero. Isso ocorre porque chamar Storyboard :: Parar apenas pára os relógios de animação, mas deixa intactas. A chamada subsequente Para começar, vai simplesmente agir como um currículo. Concordo que isso é um pouco contra-intuitivo, no entanto, se você ler a documentação ClockController :: Parar , você verá o seguinte nas observações:
Este método altera do relógio alvo CurrentState para Parado.
Um relógio parado pode ser reiniciado usando o Begin, Seek, ou método SeekAlignedToLastTick.
Desculpe Scott, eu não estava prestando atenção. Você tentou definir o FillBehavior no Storyboard. Defina o FillBehavior de Paragem repõe a animação. Não tenho certeza por que parar não fazê-lo embora ...
<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;
, em seguida, criar um novo storyboard
Storyboard storyboard_name = (Storyboard)(FindResource("overlay"));
storyboard_name.Begin();
o storyboard "storyboard_name" será iniciado.
Se você quiser parar a tentativa storyboard.please como este
storyboard_name.Stop();
Se você quiser remover a tentativa storyboard.please como este
storyboard_name.Remove();
outros detalhes podem ser:
this.MyAnimation.FillBehavior = FillBehavior.Stop;