使用Storyboard作为计时器有什么意义?

时间:2010-07-05 08:40:02

标签: wpf silverlight timer storyboard

我见过一些代码示例,其中StoryBoard用作Timer,例如:

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

故事板在某些方面比定时器好吗?为什么人们会使用它?

P.S。问题与Silverlight和/或WPF有关。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

然而,正如马克指出,如果所有真正需要的是延迟,那么DispatcherTimer将是更直观的选择。与DispatcherTimer的区别在于其设计用于定期调用其Tick事件,而Storyboard每次调用Completed时最多只调用一次Begin。通过在第一个DispatcherTimer事件发生时调用Stop方法,可以以这种方式使用Tick