Wpf 如何暂停故事板?

Wpf 如何暂停故事板?,wpf,animation,storyboard,Wpf,Animation,Storyboard,这似乎是一个不需要动脑筋的问题,但我无法让WPF故事板停下来。我称之为暂停,但什么也没发生——它一直保持动画效果 这里有一个复制的例子:一个按钮,它可以设置宽度的动画。如果单击该按钮,它将调用情节提要上的暂停。我希望,只要我点击按钮,它的宽度就会停止变化;相反,它的宽度在动画上保持正确,好像我从未调用过暂停 NameScope.SetNameScope(this, new NameScope()); var storyboard = new Storyboard(); var button =

这似乎是一个不需要动脑筋的问题,但我无法让WPF故事板停下来。我称之为暂停,但什么也没发生——它一直保持动画效果

这里有一个复制的例子:一个按钮,它可以设置宽度的动画。如果单击该按钮,它将调用情节提要上的暂停。我希望,只要我点击按钮,它的宽度就会停止变化;相反,它的宽度在动画上保持正确,好像我从未调用过暂停

NameScope.SetNameScope(this, new NameScope());
var storyboard = new Storyboard();

var button = new Button { Content = "Pause", Name = "pause" };
this.Content = button;
RegisterName(button.Name, button);
var animation = new DoubleAnimation(0, 200, TimeSpan.FromSeconds(5));
Storyboard.SetTargetName(animation, button.Name);
Storyboard.SetTargetProperty(animation,
    new PropertyPath(FrameworkElement.WidthProperty));
storyboard.Children.Add(animation);

button.Click += (sender, e) => { storyboard.Pause(this); };
storyboard.Begin(this);
根据我对文档的理解,我应该使用传递给
Begin
的相同参数调用
Pause(FrameworkElement)
重载,因此上面的
Pause(this)
。但我也尝试了
故事板.Pause()
,行为没有改变。我还尝试了
故事板。暂停(按钮)
只是为了见鬼,同样没有效果。我会尝试
storyboard.Pause(storyboard)
storyboard.Pause(animation)
只是为了用尽可能,但两者都不编译——它需要FrameworkElement(或FrameworkContentElement)


如何让故事板暂停?

我不知道您为什么要使用weired SetNameScope等。清除您的代码我可以让它工作:

        //NameScope.SetNameScope(this, new NameScope());
        var storyboard = new Storyboard();

        var button = new Button { Content = "Pause", Name = "pause" };
        this.Content = button;
        //RegisterName(button.Name, button);
        var animation = new DoubleAnimation(0, 200, TimeSpan.FromSeconds(5));
        Storyboard.SetTarget(animation, button);
        Storyboard.SetTargetProperty(animation,
            new PropertyPath(FrameworkElement.WidthProperty));
        storyboard.Children.Add(animation);

        button.Click += (sender, e) => { storyboard.Pause(); };
        storyboard.Begin();

呵呵。MSDN文档坚持您必须设置名称范围,但您的版本(a)更简单,(b)有效。我要了。我得说我有点困惑。。我已经为WPF编程5年了,这是我第一次看到使用NameScope&RegisterName…:-/看起来代码更改的神奇组合是:(a)使用SetTarget而不是SetTargetName,以及(b)使用无参数的
Begin
Pause
而不是传递
this
。名称镜是无害的,尽管在使用SetTarget时没有必要。是的,嗯。。。我只是删除了我从未使用过的所有东西,它起了作用;-)坚持使用NameScope/RegisterName的文档如下:“故事板概述”。我不知道他们为什么这么说--我更喜欢你的版本。