1

我有一种情况,我需要确定我是否已经到达情节提要的结尾,然后需要寻找它的结尾。

我想要做:

storyboard.Seek(timespan);

但是,如果时间跨度比情节提要的持续时间长,我会得到一个例外。如果我看

storyboard.Duration.TimeSpan

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

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

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

4

2 回答 2

3

也许我不明白,但如果你总是需要寻找到动画的结尾,为什么不使用 seektofill 方法呢?
MSDN 链接

此外,这里是 Storyboard Duration 结构的文档,并解释了如果需要,如何将其设置为自动以外的其他内容 - 但如果您总是需要走到最后,我只需使用 skiptofill 方法:
MSDN 链接

于 2009-12-14T20:56:18.497 回答
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);
    }
}
于 2009-12-14T22:43:37.597 回答