如何在C# / WPF中停止动画?

51

我有类似于这样的代码:

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

现在,你如何停止这个动画(即DoubleAnimation)?我想要这么做是因为我想开始新的动画(貌似这行得通,但很难确定),并最终停止上一个动画......

8个回答

90
为了停止它,请使用第二个参数设置为null再次调用BeginAnimation

6
注意:如果指定HandoffBehavior.Compose,则此方法无效。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms590757%28v=VS.90%29.aspx。请留意动画参数的文档。 - LukeN
3
第二次调用BeginAnimation似乎不能停止第一次动画的“时钟”继续前进。经过指定时间后,动画会引发Completed事件。它不是在调用BeginAnimation时直接引发,而是在动画完成时引发。 - BatteryBackupUnit
请告诉我如何在vb.net中将第二个参数设置为null?myStoryboard.Begin(containingObject:=Me, isControllable:=True, handoffBehavior:=Animation.HandoffBehavior.SnapshotAndReplace) - Herry Markowitz
在VB.NET中,@HerryMarkowitz使用关键字Nothing。-- https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/nothing - BrainSlugs83

35

使用故事板来控制动画时,确保将第二个参数设置为true,以将动画设置为可控制的:

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

5
感谢你,我想知道为什么我的动画没有响应“停止”! - Joon
2
是的,是的,是的,这就做到了。那个缺失的"true"让我抓狂 :) - Johan Danforth
1
你真是个传奇!这让我疯了! - Mark Staff
1
这个问题涉及到动画,而不是故事板(正如这个答案所回应的)。 - SandRock

18

停止BeginAnimation有两种方法。第一种是再次调用BeginAnimation,将第二个参数设置为null。这将移除属性上的所有动画并将该值还原回其基础值。

根据您使用该值的方式,这可能不是您想要的行为。第二种方法是将动画的BeginTime设置为null,然后以它调用BeginAnimation。这将删除该特定动画并使该值保持在当前位置。

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);

我同意。这回答了问题,特别适用于OP对动画的要求,而不是Storyboard,并提供了两个好选择。 - Grim
请注意,如果您正在使用“HandoffBehavior.Compose”,则此方法无效。 - BrainSlugs83

11
<Trigger.EnterActions>
       <BeginStoryboard x:Name="myStory">
       .........
       </BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
       <StopStoryboard BeginStoryboardName="myStory"/>
</Trigger.ExitActions>

2
StopStoryBoard在Windows Presentation Foundation (WPF)项目中不受支持。 - Simon Smith
2
@SimonSmith 在WPF中支持StopStoryBoard - Rekshino

9
在我的情况下,我需要使用两个命令。我的XAML有一个按钮,触发器会触发故事板动画。我已经添加了一个按钮来停止动画,代码如下:
MyBeginStoryboard.Storyboard.Begin(this, true);
MyBeginStoryboard.Storyboard.Stop(this);

我不喜欢它,但在这里确实很有效。试一试吧!


3
记得调用Storyboard.Remove(this),否则你的FrameworkElement将保留对storyboard的引用,可能导致内存泄漏。我在我的代码中找到一个实例,仅停止和替换动画后运行了几周,就会留下4000多个根动画。 - LukeN

8
如果您想让基础值再次成为有效值,则必须停止动画对属性的影响。使用故事板动画有三种方法可以实现此目的:
  • 将动画的FillBehavior属性设置为Stop
  • 删除整个故事板
  • 从单个属性中删除动画

来自MSDN

如何:在使用故事板动画后设置属性


4

将动画放在 StoryBoard 中。调用 storyboard 上的 Begin() 和 Stop() 方法来启动或停止动画。


0
你可以使用这段代码:
[StoryBoardName].Remove([StoryBoardOwnerControl]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接