【问题标题】:WPF DispatcherFrame magic - how and why this works?WPF DispatcherFrame 魔术 - 如何以及为什么这样工作?
【发布时间】:2015-10-07 21:46:50
【问题描述】:

我试图为WPF 中的一些内容设置动画,并在动画完成后运行其他一些操作。

另外,想避免动画结束回调机制,所以想出了如下代码所示的解决方案:

// Start one second of animation
...

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

// Continue and do some other stuff
...

现在,有趣的部分是 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);
    }

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

【问题讨论】:

  • 您是否还阅读了Dispatcher.PushFrame 中的备注部分?我猜它解释了一切。
  • 是的,我已经读过,但仍不清楚。 Dispatcher 是一个接一个地循环初始 Frame(在启动时创建)和我的 Frame,还是只循环我的 Frame?
  • 另外,当我将PushFrame 设置为Contionuefalse 时会发生什么
  • PushFrame“进入执行循环”(MSDN)。只要其 Continue 属性为真,该循环(即 DispatcherFrame)就会执行。一旦 Continue 属性变为 false,就会退出循环/帧,并且 Dispatcher 返回到它在调用 PushFrame 之前执行的循环/帧。
  • 太好了,这是我的假设之一,也在反汇编代码中检查过,看起来像这样。现在,我非常清楚发生了什么。请写上之前的评论作为答案,我会接受的。非常感谢!

标签: c# wpf


【解决方案1】:

来自MSDN

推帧

进入一个执行循环。

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

只要Continue 属性变为false,就会退出循环/帧,并且调度程序会返回到它在调用 PushFrame 之前执行的循环/帧。

【讨论】:

    【解决方案2】:

    如果你想暂停一下,为什么不这样呢?

    private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        var btn = sender as Button;
        btn.Content = "Before pause";
    
        var animation = new DoubleAnimation();
        animation.From = btn.ActualWidth;
        animation.To = 100;
        animation.Duration = TimeSpan.FromSeconds(2);
    
        btn.BeginAnimation(Button.WidthProperty, animation);
    
        await Task.Delay(2000);
    
        btn.Content = "After pause";
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-19
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2023-03-18
      • 2019-01-17
      • 1970-01-01
      • 2018-12-21
      相关资源
      最近更新 更多