调度程序事件在屏幕上呈现得太快。我怎样才能“减慢”这个过程?

时间:2011-03-19 10:03:11

标签: wpf animation dispatcher

我有一个UniformGrid,每个单元格都有白色或红色。 我想要一个在所有网格坐标上运行的循环(从上到下,从左到右)并将网格单元格绘制为红色,但我希望这样做看起来像一个动画 - 填充网格的红线。实际上,网格只是在一秒钟内完全填满,因此没有动画的错觉。

我有一个循环运行调用UI Dispatcher并向它发送“paintCell”函数,该函数为单元格(红色或白色)着色。据说,似乎Dispatcher对象运行paintCell代码,但实际上并没有重新绘制屏幕,​​直到所有排队的渲染事件都被处理并从队列中删除。 我尝试添加:“Thread.sleep(500)”,认为我可能会减慢整个着色和渲染部分,但程序在细胞着色之间的间隔行为相同 - 程序确实睡眠,但整个网格直到重新绘制并立即渲染。

需要澄清吗?

2 个答案:

答案 0 :(得分:2)

您不应该在UI线程中Sleep(我怀疑您这样做),因为这会在Sleep期间阻止整个UI。你应该在你的循环中进行睡眠,它通过Dispatcher发送更新(你在一个单独的线程中运行循环,当然,对吗?)

答案 1 :(得分:2)

您应该使用DispatcherTimer进行绘画操作。 DispatcherTimer在UI线程上运行,因此您可以在那里调用paintCell方法而无需任何额外的工作:

   DispatcherTimer _timer = new DispatcherTimer();
   void StartTimer()
   {            
        _timer.Interval = new TimeSpan(0, 0, timerResolutionInSeconds);
        _timer.Tick += (s, e) => TimerElapsed();
        _timer.Start();
   }

   int cell;
   private void TimerElapsed()
   {
        paintCell(cell++);
        // .... stop timer when done
        if (done)
           _timer.Stop()
   }