Предложения для замены MessageBox.Show, который не блокирует поток GUI? - PullRequest
3 голосов
/ 14 октября 2008

Некоторое время назад я столкнулся с ситуацией, когда нам нужно было отображать окна сообщений пользователю для уведомлений, но мы не могли использовать MessageBox.Show, потому что он блокирует поток GUI (поэтому на экране ничего не обновляется, пока диалоговое окно активный). Есть предложения по альтернативе?

[Я тогда закодировал альтернативу, но она мне не нравится. Я отправлю это как ответ, если ничто лучше не появляется все же]

РЕДАКТИРОВАТЬ: диалог должен плавать в верхней части главного окна; Мне все равно, если он появляется на панели задач или нет. При определенных обстоятельствах одновременно может быть активным несколько диалогов.

ADDENDUM: моим решением была базовая форма, в которой были кнопки OK и CANCEL для выдачи завершенных и отмененных событий; OK вызвал виртуальный ValidateData для переопределения подкласса. Вызывающая форма использовала свойства, чтобы избежать повторного создания формы каждый раз (форма была просто скрыта, а не закрыта), и хранила словарь активных форм, чтобы одна и та же форма не активировалась более одного раза. Это похоже на модальную форму, поддерживает несколько всплывающих форм одновременно, но не связывает основной поток GUI.

Ответы [ 7 ]

4 голосов
/ 14 октября 2008

Я предлагаю придерживаться немодального подхода, как говорили другие, но немного более конкретно:

  • Если вы просто хотите получить уведомление, вы можете попробовать всплывающую подсказку (TNA или вашу собственную) или окно, похожее на почтовое уведомление Outlook или уведомление многих мессенджеров, таких как отображение Trillian.
  • Если вы просто хотите дать пользователю возможность действовать, используйте немодальную форму, но помните, что он вполне может просто щелкнуть ее.
  • Если пользователь ДОЛЖЕН действовать в соответствии с вашим сообщением, вам следует перейти к модальному режиму. Обратите внимание, что окно владельца будет по-прежнему окрашено, и вы можете обновить свой графический интерфейс - модальный диалог, в конце концов, имеет насос сообщений, иначе он не будет работать. Недавно я сделал что-то подобное: у нас был фоновый пул рабочих потоков, который выполнял любые действия и события запуска для обновления графического интерфейса, и диалоговое окно модального ожидания, которое все еще получало сообщения. Окно владельца обновилось с фоновым действием, как и ожидалось.
4 голосов
/ 14 октября 2008

Я согласен с Рслитом и Митчелом Селлерсом. Создание немодальной формы для отображения необходимой информации - лучший путь. Если у вас есть несколько сообщений, вы можете подумать о том, чтобы поместить их в ListBox, и пользователь дважды щелкнет по ним, чтобы получить полную информацию, которая должна отображаться.

2 голосов
/ 14 мая 2010

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

1 голос
/ 13 ноября 2008

спасибо всем, кто внес предложения, похоже, мое решение было правильным; -)

моим решением была базовая форма, в которой были кнопки OK и CANCEL для отправки завершенных и отмененных событий; OK вызвал виртуальный ValidateData для переопределения подкласса. Вызывающая форма использовала свойства, чтобы избежать повторного создания формы каждый раз (форма была просто скрыта, а не закрыта), и хранила словарь активных форм, чтобы одна и та же форма не активировалась более одного раза. Это похоже на модальную форму, поддерживает несколько всплывающих форм одновременно, но не связывает основной поток GUI.

1 голос
/ 14 октября 2008

Если вы не хотите, чтобы он блокировался, я бы просто создал вашу собственную простую форму для отображения. Именно так я выполнил задания для клиентов раньше, когда требовалось неблокирующее решение. Но имейте в виду, что если вы сделаете это неблокирующим, пользователи могут набрать несколько очков и быть ошеломленными, если они действительно являются элементами типа «вы должны действовать».

1 голос
/ 14 октября 2008

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

0 голосов
/ 14 октября 2008

Если вам нужен внешний вид MessageBox, просто покажите его в фоновом потоке.

ThreadPool.QueueUserWorkItem( (state) =>
    {
         MessageBox.Show("Your message");
    });

(код не проверен)

...