Отображение сообщения загрузки WPF до завершения обновления пользовательского интерфейса

В моем приложении я позволяю пользователю выбирать элемент из дерева элементов с левой стороны, и когда этот элемент будет выбран, я должен обновить пользовательский интерфейс с правой стороны. Теперь, во время обновления пользовательского интерфейса (который может занять секунду или две), я отображаю сообщение "Пожалуйста, подождите", чтобы указать, что приложение в настоящее время работает через фоновый поток.

Когда загрузка пользовательского интерфейса завершена, я хочу, чтобы это окно "Пожалуйста, подождите" исчезло, но теперь проблема заключается в том, что процесс извлечения данных заканчивается довольно быстро, из-за чего окно "Пожалуйста, подождите" исчезает, но поскольку пользовательский интерфейс Еще не обновлено, приложение застревает на секунду, а затем, только после обновления пользовательского интерфейса, оно выходит.

Как я могу отправить сообщение об удалении окна сообщения "Пожалуйста, подождите" только после того, как пользовательский интерфейс завершил свою работу и обновился? (Я использую GalaSoft's Messenger класс для отправки сообщений через мое приложение)

РЕДАКТИРОВАТЬ: это мой код для справки:

// Show the "Please wait window" while running the long operation
var t = Task.Factory.StartNew(() => LoadingHelper.ShowProgressBar());

t.ContinueWith((priorTask) =>
                    {
                        // DOING SOME HEAVY LIFTING WORK HERE

                        // TRYING TO FORCE THE UI TO REFRESH
                        Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
                    });
t.ContinueWith((antecedent) => LoadingHelper.HideProgressBar()); // Make the loading window disappear

EDIT2:

Я в курсе асинхронного программирования. Мой вопрос был, главным образом, так как моя "тяжелая работа" выполнена, и сообщение "Пожалуйста, подождите" удалено, но пользовательский интерфейс обновляется, чтобы отразить результаты тяжелой работы, и это занимает несколько минут. Я хочу оставить сообщение "Пожалуйста, подождите" на экране, пока весь пользовательский интерфейс не загрузится (возможно, с помощью Loaded событие на контроле?)

2 ответа

Год слишком поздно, но вместо того, чтобы форсировать рендеринг, почему бы не попытаться дождаться окончания рендеринга и отправки?

Может быть, избавиться от линии, и сделать

Application.Current.Dispatcher.Invoke(new Action(() => LoadingHelper.HideProgressBar()), DispatcherPriority.ContextIdle, null)

на точной линии вы пытаетесь силой сделать?

То, что вы ищете, это асинхронное программирование

Прочитайте это http://msdn.microsoft.com/en-us/library/hh191443.aspx

Это помогает в конкретной ситуации, когда вы не хотите блокировать пользовательский интерфейс (и, следовательно, плохо отражаете пользовательский интерфейс), но вам нужно работать в фоновом режиме.

В этой статье есть несколько полезных примеров.

Создайте свою задачу, чтобы сделать тяжелую работу.

Создайте асинхронный метод void, чтобы вызвать задачу и дождаться ее.

Перед тем, как дождаться выполнения задачи, покажите свое сообщение о занятости> дождитесь выполнения задачи> после завершения задачи удалите сообщение о занятости.

Здесь важно то, что вы снимаете нагрузку с потока пользовательского интерфейса и передаете ее другому. На данный момент звучит так, будто ваш поток пользовательского интерфейса выполняет больше обработки, чем нужно.

Другие вопросы по тегам