我有一个UniformGrid,每个单元格都有白色或红色。 我想要一个在所有网格坐标上运行的循环(从上到下,从左到右)并将网格单元格绘制为红色,但我希望这样做看起来像一个动画 - 填充网格的红线。实际上,网格只是在一秒钟内完全填满,因此没有动画的错觉。
我有一个循环运行调用UI Dispatcher并向它发送“paintCell”函数,该函数为单元格(红色或白色)着色。据说,似乎Dispatcher对象运行paintCell代码,但实际上并没有重新绘制屏幕,直到所有排队的渲染事件都被处理并从队列中删除。 我尝试添加:“Thread.sleep(500)”,认为我可能会减慢整个着色和渲染部分,但程序在细胞着色之间的间隔行为相同 - 程序确实睡眠,但整个网格直到重新绘制并立即渲染。
需要澄清吗?
答案 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()
}