3

我看过一些将 StoryBoard 用作计时器的代码示例,例如:

void Update()
    {
        if (_sb == null)
        {
            _sb = new Storyboard();
            _sb.Completed += _sb_Completed;
            _sb.Duration = new Duration(TimeSpan.FromSeconds(1));
        }
        if (_sb_completed)
        {
            _sb.Begin();
            _sb_completed = false;
        }
    }
    void _sb_Completed(object sender, EventArgs e)
    {
        PerformUpdate();
        _sb_completed = true;
    }

Storyboard 在某些时候比 Timer 更好吗?人们为什么使用它?

PS 问题与 Silverlight 和/或 WPF 有关。

4

2 回答 2

3

Storyboard 和 DispatcherTimer 一样,在 UI 线程上运行。因此,无论哪种情况,您都不会看到跨线程异常。

您可以在 DispatcherTimer 上使用 Storyboard,因为 Storyboard 具有更高的优先级。

但我不确定 Timer 对象本身,因为我从未真正使用它来支持 Storyboard 或 DispatcherTimer。

于 2010-07-06T00:24:54.040 回答
2

使用 aStoryboard不同于使用标准System.Threading.Timer。在Storybroad主线程上操作,因此Completed甚至可以操作 UI 元素而不会出现跨线程异常。标准Timer回调不在 UI 线程上运行,因此需要额外的帮助来操作 UI 元素。

然而,正如 Mark 指出的那样,如果真正需要的只是延迟,那么 aDispatcherTimer将是更直观的选择。不同之DispatcherTimer处在于,它旨在Tick定期调用其事件,而Storyboard每次Completed调用Begin. 通过在第一个事件发生DispatcherTimer时调用它的方法,可以以这种方式使用A。StopTick

于 2010-07-05T12:51:01.923 回答