Отображение анимации ожидания, пока заполнен пользовательский интерфейс - PullRequest
2 голосов
/ 17 октября 2011

Я пишу окно WinForms в C #, которое отображает около 12 ListBox и 6 ComboBox элементов управления, каждый из которых содержит от нескольких сотен до нескольких тысяч элементов.

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

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

Для большинства задач, которые занимают немного времени, я решаю это следующим образом:

Program.ShowPleaseWait(); // Show top-most animation

Thread t = new Thread(stuffToDo); // Run stuffToDo() in separate thread
t.Start();

While (t.IsAlive)
  Application.DoEvents(); // Run message queue, necessary for animation

Program.HidePleaseWait(); // Hide top-most animation

и это работает довольно хорошо.Иногда материал в потоке должен вызывать что-то, и это иногда вызывает небольшой сбой в анимации, но обычно это не имеет большого значения.

С этой формой, однако, весь Код в потоке - это код пользовательского интерфейса: заполнение списков и комбинированных списков.Это означает, что все должно быть заключено в блоки Invoke, что не имеет никакого смысла, потому что тогда нет смысла запускать его в отдельном потоке, во-первых.

Кроме удаления всего рабочего потокадля этого конкретного случая и добавляя Application.DoEvents() каждые сто или около того вставок в каждом цикле, могу ли я что-нибудь сделать, чтобы рабочая анимация продолжалась, пока заполнены элементы управления?

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Просто запустите анимацию во втором потоке.Вам разрешено иметь несколько потоков пользовательского интерфейса, но не разрешается доступ к любому объекту пользовательского интерфейса из потока, отличного от того, который его инициализировал.Новый поток должен принять экземпляр LoadingAnimationForm (или как вы называете это анимированное диалоговое окно) и вызвать Application.Run(animForm); Когда основной поток завершит заполнение всего, вызовите animForm.Invoke(animForm.Close).Не вызывайте никакие другие методы для animForm из основного потока.

1 голос
/ 17 октября 2011

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

Единственная сложность заключается в том, что вам нужно организовать ваше простое событие, чтобы оно выполняло лишь небольшую работу при каждом вызове, а не выполняло все сразу.Если вы выполняете все это за один раз, диалоговое окно никогда не сможет обработать и показать обновленную анимацию ожидания.

0 голосов
/ 13 марта 2013

Взято из этого поста :

Могу ли я добавить этот CodeProject ссылка ?

Все, что вам нужно, это построить, перетащить с панели инструментов и использовать. Компонент LoadingCircle работает без каких-либо проблем. Работает как шарм, вы даже можете настроить его!

...