Создание MessageBox, который не останавливает код?

Хорошо, я ищу что-то довольно простое: создание MessageBox, который не останавливает мой код.

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

Спасибо!

18
задан sooprise 8 July 2010 в 16:05
поделиться

2 ответа

Нет, вам придется создать свою собственную форму окна сообщения. класс MessageBox поддерживает только поведение, подобное .ShowDialog(), которое является модальной операцией.

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


Обновление 2014-07-31

В духе сохранения ясности для тех, кто найдет это через google, я бы хотел потратить секунду на то, чтобы объяснить это немного подробнее:

Под капотом MessageBox является причудливой оберткой C# вокруг Windows SDK user32.dll MessageBox Function и поэтому ведет себя точно так же (после преобразования .NET Enums в целые числа, которые представляют то же самое в системном вызове.

Это означает, что когда вы вызываете MessageBox.Show(), вызов передается в ОС и будет блокировать текущий поток, пока не будет выбрана опция или окно не будет закрыто. Чтобы предотвратить остановку кода, вам нужно запустить окно сообщений в отдельном потоке, но это будет означать, что любой результат, полученный от окна сообщений (Yes / No / Ok / Cancel / Etc...), будет возвращен в отдельный поток, которому было поручено вызвать окно сообщений.

Если вы будете действовать с результатом этого запущенного таким образом окна сообщений, вам придется диспетчеризировать результат обратно в UI Thread для обеспечения безопасности потока.

В качестве альтернативы вы можете создать свою собственную форму окна сообщений в WinForms / WPF и вызвать ее методом .Show(). Любые события нажатия на кнопки будут выполняться в UI Thread, и вам не придется диспетчеризировать вызовы обратно в UI Thread для манипуляций в UI.

10
ответ дан 30 November 2019 в 08:37
поделиться

Можно раскрутить еще один message pump, вызвав его в отдельном потоке. MessageBox.Show качает сообщение, поэтому это безопасно делать без вызова Application.Run.

public void ShowMessageBox()
{
  var thread = new Thread(
    () =>
    {
      MessageBox.Show(...);
    });
  thread.Start();
}

Edit:

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

14
ответ дан 30 November 2019 в 08:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: