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

1

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

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

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

EDIT: Это мой код для справки:

// 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:

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

Теги:
wpf
user-interface
uirefreshcontrol

2 ответа

1

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

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

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

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

0

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

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

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

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

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

Создайте метод async void, чтобы вызвать задачу и ждать ее.

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

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

  • 0
    Спасибо Гэвин. Я знаю об асинхронном программировании, поэтому я использую TPL. Но в моем случае работа завершена, и затем, когда пользовательский интерфейс обновляется, требуется несколько секунд, чтобы загрузить все элементы управления (с графиками и анимацией). Мой вопрос состоял в том, что я хотел показать окно индикатора выполнения, пока весь пользовательский интерфейс не будет загружен, а не только после того, как моя «тяжелая работа» была завершена. Я обновлю свой вопрос, чтобы отразить это.
  • 0
    Я бы с подозрением относился к «застрявшему интерфейсу», который вы упомянули после тяжелой работы. Если только это не очень сложный интерфейс; большинство обновлений пользовательского интерфейса (когда любая другая работа должным образом не блокирует поток пользовательского интерфейса) выполняется очень быстро и происходит за миллисекунды. Предоставление индикатора «занят», показывающего, что пользовательский интерфейс загружается, является лишь добавлением к работе, которую должен выполнять поток пользовательского интерфейса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню