2008-08-21 11 views
42

Ich habe so etwas wie dies:Wie man eine Animation in C#/WPF stoppt?

 
barProgress.BeginAnimation(RangeBase.ValueProperty, new DoubleAnimation(
    barProgress.Value, dNextProgressValue, 
    new Duration(TimeSpan.FromSeconds(dDuration))); 

Nun, wie würden Sie, dass die Animation stoppen (die DoubleAnimation)? Der Grund, warum ich das möchte, ist, weil ich neue Animationen starten möchte (das scheint zu funktionieren, aber es ist schwer zu sagen) und schließlich die letzte Animation zu stoppen ...

Antwort

69

Um es zu stoppen, rufen Sie BeginAnimation erneut mit Das zweite Argument ist auf null gesetzt.

+6

vorsichtig. Dies funktioniert nicht, wenn Sie HandoffBehavior.Compose angeben. Einzelheiten finden Sie unter http://msdn.microsoft.com/en-us/library/ms590757%28v=VS.90%29.aspx.Achten Sie auf den doco für den Animationsparameter. – LukeN

+0

Der Aufruf von 'BeginAnimation' zum zweiten Mal scheint die Animation" Uhr "der ersten Animation nicht zu stoppen. Nach der angegebenen Zeit löst die Animation das Ereignis "Completed" aus. Wird nicht direkt beim Aufruf von BeginAnimation aufgerufen, sondern wenn die Animation * beendet wäre. – BatteryBackupUnit

4

Platzieren Sie die Animation in einem StoryBoard. Rufen Sie Begin() und Stop() auf dem Storyboard auf, um die Animationen zu stoppen.

28

Wenn Storyboards mit einer Animation zu steuern, stellen Sie sicher, dass Sie den zweiten Parameter auf true gesetzt, um die Animation als steuerbar einzustellen:

public void Begin(
    FrameworkContentElement containingObject, 
    **bool isControllable** 
) 
+4

Plus eins für Sie, ich habe mich gefragt, warum meine Animation nicht auf "Stop" reagiert hat! – Joon

+2

Ja, ja, ja, das war es. Das fehlende "wahre" hat mich verrückt gemacht :) –

+1

du bist eine Legende! Das hat mich verrückt gemacht! –

7

Wenn Sie den Basiswert der wirksam zu werden wollen Wert wieder, müssen Sie stoppen Sie die Animation von die Eigenschaft zu beeinflussen. Es gibt drei Möglichkeiten, um tun dies mit Storyboard-Animationen:

  • Stellen Sie die FillBehavior Unterkunft Animation zu stoppen
  • entfernen die gesamte Storyboard
  • Entfernen Sie die Animation aus dem einzelne Eigenschaft

Von MSDN

How to: Set a Property After Animating It with a Storyboard

7

In meinem Fall musste ich zwei Befehle verwenden, mein Xaml hat eine Schaltfläche, die einen Trigger auslöst, und der Auslöser löst die Storyboard-Animation aus.

Ich habe eine Schaltfläche setzt Animation mit diesem Code zu stoppen hinter:

MyBeginStoryboard.Storyboard.Begin(this, true); 
MyBeginStoryboard.Storyboard.Stop(this); 

Ich mag es nicht, aber es funktioniert wirklich hier. Versuche es!

+2

Vergessen Sie nicht, Storyboard.Remove (this) aufzurufen, da sonst Speicher verloren geht, da Ihr FrameworkElement einen Verweis auf das Storyboard behält. Ich habe gerade eine Instanz in meinem Code gefunden, bei der nur die Animation gestoppt und ersetzt wurde, nachdem mehr als 4000 Animationen erstellt wurden, nachdem sie einige Wochen lang ausgeführt wurden. – LukeN

14

Es gibt zwei Möglichkeiten, eine BeginAnimation zu stoppen. Die erste besteht darin, BeginAnimation erneut aufzurufen, wobei der zweite Parameter auf null gesetzt ist. Dadurch werden alle Animationen in der Eigenschaft entfernt und den Wert auf seinen Basiswert zurückgesetzt.

Je nachdem, wie Sie diesen Wert verwenden, ist dies möglicherweise nicht das gewünschte Verhalten. Die zweite Möglichkeit besteht darin, die Animationen BeginTime auf null zu setzen und anschließend BeginAnimation aufzurufen. Dadurch wird diese bestimmte Animation entfernt und der Wert an der aktuellen Position belassen.

DoubleAnimation myAnimation = new Animation(); 
// Initialize animation 
... 

// To start 
element.BeginAnimation(Property, myAnimation); 

// To stop and keep the current value of the animated property 
myAnimation.BeginTime = null; 
element.BeginAnimation(Property, myAnimation); 
+0

Ich stimme zu. Dies beantwortet die Frage, bezieht sich speziell auf die OP-Anfrage nach Animationen, kein Storyboard und bietet zwei gute Möglichkeiten. – Grim

0

können Sie diesen Code verwenden:

[StoryBoardName].Remove([StoryBoardOwnerControl]); 
4
<Trigger.EnterActions> 
     <BeginStoryboard x:Name="myStory"> 
     ......... 
     </BeginStoryboard> 
</Trigger.EnterActions> 
<Trigger.ExitActions> 
     <StopStoryboard BeginStoryboardName="myStory"/> 
</Trigger.ExitActions> 
+2

StopStoryBoard wird in einem Windows Presentation Foundation (WPF) -Projekt nicht unterstützt –

Verwandte Themen