Хорошо, я ищу что-то довольно простое: создание MessageBox, который не останавливает мой код.
Я предполагаю, что должен буду создать другой поток или что-то? Консультируйте по вопросам лучшего способа выполнить это.
Спасибо!
Нет, вам придется создать свою собственную форму окна сообщения. класс 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.
Можно раскрутить еще один message pump, вызвав его в отдельном потоке. MessageBox.Show
качает сообщение, поэтому это безопасно делать без вызова Application.Run
.
public void ShowMessageBox()
{
var thread = new Thread(
() =>
{
MessageBox.Show(...);
});
thread.Start();
}
Edit:
Наверное, стоит упомянуть, что я не рекомендую это делать. Это может вызвать другие проблемы. Например, если у вас есть два потока, перекачивающих сообщения, то возможно, что окно сообщения застрянет за другой формой, и вы не сможете заставить его исчезнуть, если форма ждет, пока кто-то закроет окно сообщения. Вам действительно следует попытаться найти другой способ обойти эту проблему.