Redémarrage d'un storyboard WPF
-
07-07-2019 - |
Question
Quel est le bon moyen d'arrêter et de redémarrer un storyboard à partir de code .net?
j'essaie ...
myStory.Stop(this);
S'attend à ce qu'un appel ultérieur à .Begin (this); redémarrera à zéro à partir de la timeline, mais le storyboard reprend là où il avait été arrêté.
j'ai essayé
.Remove(this);
et j'ai essayé
.Seek(TimeSpan.Zero);
qui n'a pas non plus fonctionné.
Plus de détails ... Voici mon exemple de 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>
Le texte dans le textone est donc exécuté. Si vous fermez l’écran et revenez rapidement à l’écran, le texttwo sera lu par-dessus un nouveau scénarimage. Ainsi, le story-board original (du premier écran) est toujours en cours de lecture, même si je l'ai supprimé et arrêté.
La solution
Pourquoi ne pas utiliser Storyboard.Seek (TimeSpan.Zero)? Semblable à la recherche dans un flux, cela devrait vous ramener au début de l’animation.
J'ai commenté que vous devriez également vous assurer que la propriété IsControllable est définie sur true. Gardez cela à l'esprit!
Autres conseils
Vous devez effectuer myStory.Remove (this) avant d'appeler myStory.Begin (this) pour que tout recommence à zéro. En effet, l'appel de Storyboard :: Stop arrête simplement les horloges d'animation, mais les laisse intactes. Un appel ultérieur à Begin servira simplement de CV. Je conviens que cela est un peu contre-intuitif, toutefois, si vous lisez la documentation ClockController :: Stop , vous verrez ce qui suit dans les remarques:
Cette méthode modifie l'horloge cible CurrentState to Stopped.
Une horloge arrêtée peut être redémarrée par en utilisant les commandes Begin, Seek ou Méthode SeekAlignedToLastTick.
Désolé Scott, je ne faisais pas attention. Avez-vous essayé de définir FillBehavior sur le Storyboard. Définissez FillBehavior sur Stop pour réinitialiser l'animation. Vous ne savez pas pourquoi Stop ne le fait pas ...
<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;
puis créez un nouveau storyboard
Storyboard storyboard_name = (Storyboard)(FindResource("overlay"));
storyboard_name.Begin();
le storyboard " storyboard_name " va commencer.
si vous voulez arrêter le storyboard.Veuillez essayer comme ça
storyboard_name.Stop();
si vous souhaitez supprimer le storyboard.Veuillez essayer comme ceci
storyboard_name.Remove();
les autres détails peuvent être:
this.MyAnimation.FillBehavior = FillBehavior.Stop;