Нужна помощь с блокировкой процесса стиля Dispatcher.PushFrame на странице WPF - PullRequest
6 голосов
/ 01 февраля 2011

Я использую Dispatcher.PushFrame, чтобы заблокировать мой код, позволяя обновлять пользовательский интерфейс до завершения длительного процесса.Это работает, как и ожидалось, пока мой вызов Dispatcher.PushFrame происходит из события нажатия кнопки.Однако, если я использую этот же код во время события или конструктора Page Loaded, пользовательский интерфейс не обновляется и никогда не рисует.В качестве случайного эксперимента я попытался использовать Window.ShowDialog из конструктора, и он позволяет рисовать пользовательский интерфейс, даже если элемент управления блокируется до закрытия модального диалога.Может ли кто-нибудь предложить решение, позволяющее использовать эту функцию из события Page Loaded с использованием Dispatcher.PushFrame или какого-либо другого ручного механизма?

В качестве дополнения, если я минимизирую или увеличиваю окно, пользовательский интерфейс рисует и я могу взаимодействоватьэто нормально, но не до тех пор, пока я не выполню изменение размера вручную.

1 Ответ

3 голосов
/ 23 марта 2011

Из моих чтений в MSDN о Событиях жизненного цикла объекта и ошеломлении в Reflector выясняется, что события Loaded и Unloaded не вызываются так же, как другие события. Внутри используется класс BroadcastEventHelper, который координирует различные события Loaded среди каждого элемента в визуальном дереве, прежде чем в конечном итоге повысить их до уровня DispatcherPriority.Loaded.

Я думаю, именно поэтому вы видите такое поведение.

Что касается конкретного решения, я предлагаю, чтобы долгосрочные задачи не помещались в обработчик событий Page.Loaded, и вместо этого для завершения работы выдается BackgroundWorker или Task.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...