如何在Silverlight中找出故事板的持续时间?

时间:2009-12-14 20:34:09

标签: silverlight animation silverlight-3.0 storyboard

我有一种情况需要确定我是否已经到达故事板的末尾,然后需要寻求结束。

我想这样做:

storyboard.Seek(timespan);

但是,如果时间跨度超过故事板的持续时间,我会得到一个例外。如果我看看

storyboard.Duration.TimeSpan

我收到错误,因为持续时间是自动的。这意味着我不能做“if(timespan> storyboard.Duration.TimeSpan)......”

一旦我知道我正在寻找的位置已经过了故事板的结尾,我只需要寻找故事板的结尾。我可以用storyboard.Seek(storyboard.Duration.TimeSpan)做到这一点,但同样,我不能使用Duration,因为它是自动的。

如果我可以强制持续时间远离自动,似乎我的所有问题都可以解决。希望我只是缺少一些简单的东西。

2 个答案:

答案 0 :(得分:3)

也许我不理解某些东西,但如果你总是需要寻找动画的结尾为什么不使用seektofill方法呢?
MSDN link

此外,这里是关于故事板持续时间结构的文档,并说明如何在需要时将其设置为自动以外的其他内容 - 但如果您总是需要结束我只是使用skiptofill方法:
MSDN link

答案 1 :(得分:1)

通过查看Egor链接的页面,我能够找到一个很好的解决方案。 (将Egor标记为答案,以确保他获得信誉。)

在故事板上设置持续时间是答案的一部分,但还不够。我正在使用这个故事板作为长时间运行的自定义控件的一部分 - 我不能保证自定义控件的重新设置版本将设置故事板的持续时间。

要解决此问题,我首先检查持续时间是否可用。如果不是,我SkipToFill()到最后,并使用GetCurrentTime()来确定故事板长度的结束。

这是我的完整解决方案:

public void UpdateControl()
{
    if (!App.IsDesignTime() && storyboard != null)
    {
        TimeSpan begin = DateTime.UtcNow - OriginTime.ToUniversalTime();
        TimeSpan end;

        // If Storyboard.Duration is set, use it to set the animation to its correct position.
        // If it isn't set, attempt to set by seeking to the end of the animation.
        if (storyboard.Duration.HasTimeSpan)
            end = storyboard.Duration.TimeSpan;
        else
        {
            storyboard.SkipToFill();
            end = storyboard.GetCurrentTime();
        }

        if (begin > end)
            begin = end;

        storyboard.Begin();
        storyboard.Seek(begin);
    }
}