Хорошо, я ищу что-то довольно простое: создание MessageBox, которое не останавливает мой код.
Я предполагаю, что мне нужно будет создать другой поток или что-то еще? Пожалуйста, сообщите нам, как это сделать.
Спасибо!
Хорошо, я ищу что-то довольно простое: создание MessageBox, которое не останавливает мой код.
Я предполагаю, что мне нужно будет создать другой поток или что-то еще? Пожалуйста, сообщите нам, как это сделать.
Спасибо!
Нет, вам нужно будет создать свою форму в форме сообщения. класс MessageBox
поддерживает только поведение, аналогичное .ShowDialog()
, которое является модальной операцией.
Просто создайте новую форму, которая принимает параметры и использует их для создания стилизованного окна сообщений по своему вкусу.
Обновление 2014-07-31
В духе поддержания ясности для всех, кто находит это через google, я хотел бы взять секунду, чтобы объяснить это немного больше:
Под капотом MessageBox
является причудливым С# Wrapper вокруг Windows SDK user32.dll MessageBox Function и, таким образом, ведет себя точно так же (после преобразования .NET Enums в целые числа, которые представляют одно и то же в системном вызове.
Это означает, что когда вы вызываете MessageBox.Show()
, вызов маршалируется в ОС и блокирует текущий поток до тех пор, пока не будет выбран параметр или окно не будет убито. Чтобы предотвратить останов вашего кода, вам нужно запустить окно сообщения в отдельном потоке, но это будет означать, что любой результат, который возвращается из окна сообщения ( Да/ Нет/ Ok/ Отмена/Etc...) будет возвращен в отдельный поток, которому было поручено вызвать окно сообщения.
Если вы активируете результат этого окна сообщения, запускаемого таким образом, вам придется отправить результат обратно в поток пользовательского интерфейса для Thread Saftey.
В качестве альтернативы вы можете создать свою собственную форму окна сообщений в WinForms/WPF и вызвать ее с помощью метода .Show()
. Любые события щелчка на кнопках будут выполняться в потоке пользовательского интерфейса, и вам не придется отправлять вызовы обратно в поток пользовательского интерфейса, чтобы манипулировать ими в пользовательском интерфейсе.
Вы можете развернуть еще один насос сообщений, называя его отдельной веткой. MessageBox.Show
, так что безопасно обойтись без вызова Application.Run
.
public void ShowMessageBox()
{
var thread = new Thread(
() =>
{
MessageBox.Show(...);
});
thread.Start();
}
Изменить:
Я, наверное, должен упомянуть, что я не рекомендую это делать. Это может вызвать другие проблемы. Например, если у вас есть два потока, пересылающих сообщения, тогда поле сообщения может застрять за другой формой, чтобы не уйти, если форма ждет, когда кто-то закроет окно сообщения. Вы действительно должны попытаться найти другой способ решения проблемы.