PushFrame блокирует окно WPF, когда пользователь перемещает окно

Я использую PushFrame, чтобы убедиться, что мое окно заканчивает рисование перед выполнением дополнительного кода. У моего приложения есть некоторые функции, зависящие от времени, которые требуют обновления окон до того, как я продолжу выполнение кода.

Итак, я использую образец из msdn: http://msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher.pushframe(v=vs.110).aspx

Что отлично работает, если только пользователь не перетаскивает мое окно, когда этот код выполняет зависание окна, и вы можете вернуть его только с помощью ctrl-alt-del.

Любые идеи?

Ответ 1

Приложение кажется замороженным, потому что захват мыши не будет автоматически освобожден от изменения размера окна или операции 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();

Ответ 2

К сожалению, у меня нет для вас решения, но можно только подтвердить, что мы можем воспроизвести это тоже в нашем приложении (и в 50-строчной примерной программе). Вы можете проголосовать для этой проблемы со связью.