Предложения по MessageBox.Показать замену, которая не блокирует поток GUI?

StackOverflow https://stackoverflow.com/questions/198868

  •  11-07-2019
  •  | 
  •  

Вопрос

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

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

Редактировать:диалоговое окно должно располагаться поверх главного окна;мне все равно, появится ли это на панели задач или нет.При определенных обстоятельствах может быть активировано сразу несколько диалоговых окон.

ДОБАВЛЕНИЕ:моим решением была базовая форма, которая предоставляла кнопки "ОК" и "ОТМЕНА" для отправки завершенных и отмененных событий;OK вызвал виртуальную ValidateData для переопределения подкласса.Вызывающая форма использовала свойства, чтобы избежать повторного создания формы каждый раз (форма была просто скрыта, а не закрыта), и сохраняла словарь активных форм, чтобы предотвратить активацию одной и той же формы более одного раза.Это выглядит как модальная форма, поддерживает сразу несколько всплывающих форм, но не связывает основной поток графического интерфейса.

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

Если вы хотите, чтобы MessageBox выглядел и работал, просто покажите его в фоновом потоке.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top