UI refresh looping a Dispatcher.BeginInvoke
本文关键字:Dispatcher BeginInvoke looping refresh UI | 更新日期: 2023-09-27 18:13:03
我正在尝试在Y轴上做一个System.Windows.Shapes.Rectangle旋转,模拟纸牌旋转,显示所有的路线。
问题是UI只在结束时刷新。
简化版代码
方法
for (i=0; i<=180; i++)
{
int j = i;
Dispatcher.BeginInvoke(new a_dispatcher(() => {
print_animation_of_card(card, i);
}),
null);
}
private void print_animation_of_card(System.Windows.Shapes.Rectangle card)
{
...
System.Windows.Media.PlaneProjection p =
card.Projection as System.Windows.Media.PlaneProjection;
p.RotationY = i;
card.Projection = p;
}
我也试着把FOR放到方法中,结果是一样的…
如何显示System.Windows.Shapes.Rectangle的所有旋转运动?
我认为问题是您使用的是BeginInvoke()
而不是Invoke
。这不会等到一个旋转角度完成后才调用下一个旋转角度,所以调用都是堆叠在一起的。
用Dispatcher.Invoke()
试试,或者把整个循环放在一个Dispatcher.BeginInvoke()
里,看看结果是否更让你满意。
最后我用BackgroundWorker完成了它,感谢@Jay的答案。
方法
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (object sender, DoWorkEventArgs e) =>
{
print_animation_of_card(card);
};
bw.RunWorkerAsync();
private void print_animation_of_card(System.Windows.Shapes.Rectangle card)
{
for (int i = 0; i <= 180; i++)
{
Thread.Sleep(3);
Dispatcher.BeginInvoke(new a_dispatcher(() =>
{
//same code as topic method code
}),null);
}
}