Отображение диалогового окна ожидания при выполнении операций интерфейса в C # - PullRequest
0 голосов
/ 17 апреля 2011

Так что мне нужно выполнять тяжелые операции интерфейса в моей программе ... Точнее, заполняя Windows Forms представление списка и генерируя изображения на лету.Это не может быть сделано в другом потоке.
Так как мне показать модальное, рабочее (отвечающее) диалоговое окно поверх моего главного WPF окна?
Диалог может быть либо WPF, либо winforms, я не понимаюМне все равно, я буду приспосабливаться ...

Он должен быть пригоден для использования и всегда оставаться над и модально блокировать его форму владельца.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2011

Просто реализуйте диалог и вызывайте его, используя .ShowDialog () внутри вашей трудоемкой функции. Везде, где у вас есть длительный цикл, время от времени вызывайте Application.DoEvents (), чтобы диалоговое окно отображалось и обновлялось. Осторожнее с этим подходом, хотя ...

Будьте осторожны, потому что, например, если вы обрабатываете событие Paint, а затем вызываете Application.DoEvents (), вы можете дважды войти в обработчик события Paint, что нежелательно.

1 голос
/ 17 апреля 2011

В окне WPF или WinForm поместите изображение и вставьте его: http://www.hindustantimes.com/images/loading_gif.gif, который автоматически оживится. Покажите окна, используя .ShowDialog(OwnerWindow), чтобы они всегда оставались поверх окон их владельцев.

0 голосов
/ 15 октября 2012

Если вы в порядке с вызовом Application.DoEvents, и это работает, то это, безусловно, один из подходов. Однако, по моему опыту, Application.DoEvents - это всегда взлом и редко хорошая идея.

Моя первая мысль: возможно, вы сможете создать фоновый поток, который генерирует ваши изображения. Начните свою тему и покажите свой модальный диалог. Для вашего потока после того, как он создал определенное количество (например, 5, 10, 20, 50 и т. Д.), Он вызвал бы диспетчер событий и выполнил метод, который обновляет ListView с новым пакетом изображений. Поскольку он вызывался только периодически, это дало бы Модальному диалогу время для обработки собственных сообщений. Функция, которую вы вызываете в диспетчере событий, получит список изображений, вызовет ListView.BeginUpdate (), пройдется по списку, создаст и добавит элементы, затем вызовет ListView.EndUpdate ()

Есть и другие способы сделать это, но я бы действительно старался избегать Application.DoEvents () (что, по моему опыту, является хаком от программистов на Visual Basic, которые не понимали многопоточность).

...