移动窗口时,PushFrame会锁定WPF窗口

15

这句与编程有关的内容听起来很别扭。为什么不直接使用正确的“DispatcherPriority”调用“Dispatcher.BeginInvoke()”? - Federico Berasategui
这是确保在返回之前实际绘制到屏幕的唯一方法。你知道begin invoke是异步的吗?如果有什么需要,我想要Invoke,但即使使用它,你仍然无法直接处理调度程序在自己的时间内处理的实际绘制更新。 - Joel Barsotti
不是真的。使用 DispatcherPriority.ApplicationIdle 可以确保您的代码在其他所有操作完成后才被调用。顺便说一句,“painted”这个词听起来太winforms了。您实际上想做什么? - Federico Berasategui
1
将屏幕更新与物理硬件监测设备同步。 - Joel Barsotti
听起来你更愿意使用TPL和TaskScheduler.FromCurrentSynchronizationContext - Federico Berasategui
不是仅仅将其调度到前台线程。我需要实际更新屏幕上的内容。 - Joel Barsotti
2个回答

6
应用程序似乎被冻结,因为在用户代码调用Dispatcher.PushFrame()之后,窗口调整大小或DragMove()操作没有自动释放鼠标捕获。解决方法是在调用Dispatcher.PushFrame()之前,手动释放应用程序中任何正在捕获鼠标的窗口的鼠标捕获。
        ...
        if (priority < DispatcherPriority.Loaded)
        {
            IntPtr capturingHandle = GetCapture();
            for (int i = 0; i < Application.Current.Windows.Count; i++)
            {
                if (new WindowInteropHelper(
                                            Application.Current.Windows[i]
                                           ).Handle == capturingHandle)
                {
                    Mouse.Capture(
                                  Application.Current.Windows[i],
                                  CaptureMode.Element
                                 );
                    Application.Current.Windows[i].ReleaseMouseCapture();
                    break;
                }
            }
        }
        ...

这个解决方法利用了 GetCapture() p/invoke 声明:
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr GetCapture();

3

很遗憾,我没有解决方案,但是我可以确认我们的应用程序(以及一个50行的示例程序)也能重现这个问题。 请随意投票此连接问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接