2009-05-07 6 views
8

Quelle est la meilleure façon d'arrêter et de redémarrer un storyboard à partir du code .net?Redémarrage d'un storyboard WPF

J'essaie ...

myStory.Stop(this); 

attendant qu'un appel ultérieur à .begin (ce); redémarrerait à partir de la timeline à zéro, mais à la place, le storyboard reprend là où il a été arrêté.

J'ai essayé

.Remove(this); 

et j'ai essayé

.Seek(TimeSpan.Zero); 

qui a également ne fonctionne pas.

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> 

Ainsi, le texte dans le TextOne court, et si vous fermez l'écran, et revenir à l'écran rapidement, le texttwo, joue en fait sur un story-board récemment commencé. Donc, le storyboard original (à partir du premier écran) est toujours là et en cours de lecture, même si j'ai été supprimé, et arrêté.

+0

peut-être que c'est ma configuration. Voici un peu plus d'infos. J'ai un baseclass avec une propriété storyboard StoryOverlay. Dans le ctor d'une classe enfant, je fais un storyOverlay = TryFindResource ("storyId") comme Storyboard; puis plus tard, je vérifie si storyOVerlay! = Null; {storyOverlay.Remove (this); } Est-ce que cela change quelque chose? – ScottCate

Répondre

8

Qu'en est-il de l'utilisation de Storyboard.Seek (TimeSpan.Zero)? Similaire à la recherche dans un Stream, cela devrait vous ramener au début de l'animation.

J'ai commenté que vous devez également vous assurer que la propriété IsControllable est définie sur true. Garde cela à l'esprit!

Storyboard.Seek method

+0

Vous devez également vous assurer que IsControllable est défini sur true et que l'objet conteneur approprié est marqué. – Rob

+0

Merci! C'est exactement ce que j'étais après !!!! – ScottCate

3

Vous devez faire myStory.Remove (this) avant d'appeler myStory.Begin (this) pour le faire recommencer à zéro. C'est parce que l'appel de Storyboard :: Stop arrête simplement les horloges d'animation, mais les laisse intactes. Un appel ultérieur à Begin, agira simplement comme un résumé. Je suis d'accord que ce soit un peu contre-intuitif, mais si vous lisez la documentation ClockController::Stop, vous verrez ce qui suit dans les remarques:

Cette méthode change CurrentState de l'horloge cible à Stopped.

Une horloge arrêtée peut être redémarrée par à l'aide de la méthode Begin, Seek ou SeekAlignedToLastTick.

+0

Semble à peu près juste pour moi. –

+0

cela ne fonctionne toujours pas pour moi. Après le myStory.Remove (this) et myStory.Stop (this), si la scène revient à l'écran, avant que le storyboard ne soit terminé, le storyboard (peut-être mieux de l'appeler Original) est toujours en cours de lecture. – ScottCate

0

Désolé Scott, je ne faisait pas attention. Avez-vous essayé de définir le FillBehavior sur le Storyboard. Définissez FillBehavior sur Stop pour réinitialiser l'animation. Je ne sais pas pourquoi d'arrêt ne le fait pas bien ...

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; 

puis créer un nouveau story-board

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

le story-board "storyboard_name" va commencer.

si vous voulez arrêter le storyboard.s'il vous plaît essayer comme ça

storyboard_name.Stop(); 

si vous souhaitez supprimer le storyboard.please essayer comme ce

storyboard_name.Remove(); 
-1

autres détails peuvent être:

this.MyAnimation.FillBehavior = FillBehavior.Stop;