WPF DispatcherFrame 魔法 - 它是如何以及为什么起作用的?

Dus*_*san 2 c# wpf

我试图WPF在动画完成时为一些东西设置动画并运行一些其他操作。

另外,想避免动画完成回调机制,所以,我想出了一个解决方案,如下面的代码所示:

// Start one second of animation
...

// Pause for one second
Wait(this.Dispatcher, 1000);

// Continue and do some other stuff
...
Run Code Online (Sandbox Code Playgroud)

现在,有趣的部分是Wait方法,它神奇地使我的代码中的阻塞暂停,动画和 UI 保持正常、响应:

    public static void Wait(Dispatcher Dispatcher, int Milliseconds)
    {
        var Frame = new DispatcherFrame();
        ThreadPool.QueueUserWorkItem(State =>
        {
            Thread.Sleep(Milliseconds);
            Frame.Continue = false;
        });
        Dispatcher.PushFrame(Frame);
    }
Run Code Online (Sandbox Code Playgroud)

我已经阅读了有关文档和几篇文章,DispatcherFrame但我仍然无法弄清楚幕后真正发生了什么,我需要澄清一下这种结构是如何PushFrame真正起作用的。

Cle*_*ens 5

MSDN

推帧

进入执行循环。

DispatcherFrame只要其Continue属性为 ,该循环(即)就会执行true

一旦Continue属性变为false,循环/帧就会退出,并且 Dispatcher 返回到它在您调用 PushFrame 之前执行的循环/帧。