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的所有旋转运动?

UI refresh looping a Dispatcher.BeginInvoke

我认为问题是您使用的是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);
    }
}