14

我正在使用 PushFrame 来确保我的窗口在执行其他代码之前完成绘制。我的应用程序有一些时间敏感的功能,需要在我继续执行代码之前更新窗口。

所以我使用来自 msdn 的示例:http: //msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher.pushframe (v=vs.110).aspx

效果很好,除非用户在执行此代码时拖动我的窗口,窗口挂起并且您只能使用 ctrl-alt-del 将其取回。

有任何想法吗?

4

2 回答 2

6

应用程序似乎已冻结,因为在从用户代码调用DragMove()之后,鼠标捕获不会从窗口调整大小或操作中自动释放。Dispatcher.PushFrame()

解决方法是在调用之前从应用程序中捕获鼠标的任何窗口手动释放鼠标捕获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();
于 2013-11-04T12:06:54.713 回答
3

不幸的是,我没有适合您的解决方案,但只能确认我们也可以在我们的应用程序(以及 50 行示例程序)中重现这一点。随意为这个连接问题投票。

于 2013-10-31T19:43:08.827 回答