#c# #winforms #messagebox
#c# #winforms #messagebox
Вопрос:
Возможно, что когда я использую:
MessageBox.Show("hello");
.. продолжать использовать форму, но окно сообщений открыто как второе окно?
потому что в настоящее время, когда я показываю MessageBox, мне нужно сначала нажать «Да» или «нет», затем я могу снова использовать свою форму.
Комментарии:
1. Вы можете создать свою собственную форму окна сообщения и отображать ее вместо этого.
Ответ №1:
Да, вы можете!
Если вы просто хотите отобразить MessageBox, вам все равно, что с ним произойдет, и вы не хотите ждать, пока он закроется, вы можете запустить его в отдельном потоке. Самый простой способ сделать это — использовать Task.Run()
.
Вот пример:
private void button1_Click(object sender, EventArgs e)
{
Task.Run(() => MessageBox.Show("hello"));
// The remaining code will run without waiting for the MessageBox to be closed.
}
Стоит упомянуть пару замечаний:
-
Используйте это только для простых окон сообщений, где результат вас не волнует. Если вы хотите действовать на основе результата и выполнить что-то (в основном потоке), все становится немного сложнее.
-
Вы не сможете сохранить MessageBox поверх формы. Как только вы начнете взаимодействовать с формой, она выйдет на первое место. Если вам нужно сохранить MessageBox сверху и при этом иметь возможность взаимодействовать с формой, пользовательский MessageBox (т. Е. form) был бы лучше в этом случае, потому что вы можете установить
Owner
свойство, чтобы оно оставалось сверху.
Ответ №2:
Нет. Приложение фокусируется на окне сообщения до тех пор, пока оно не будет отклонено. Согласно документации:
Это модальное окно, блокирующее другие действия в приложении, пока пользователь не закроет его.
Что вы можете сделать, это создать свою собственную форму, оформить ее так, чтобы она выглядела как стандартное окно сообщения, и показать эту форму, используя .Show()
функциональность ее экземпляра:
var messageBox = new MyCustomMessageBox("hello");
messageBox.Show();
Если вы хотите, чтобы функциональность была идентичной в использовании, вы могли бы даже добавить static
метод в свою пользовательскую форму, который инкапсулирует его:
public static void Show(string message)
{
new MyCustomMessageBox(message).Show();
}
Хотя чего бы я не рекомендовал делать, так это вызывать вашу пользовательскую форму MessageBox
, это просто внесло бы путаницу.
Комментарии:
1. ох. хорошо, можно переопределить метод, который блокирует другие действия?
2. @AleaLindemann: Непонятно, что вы имеете в виду, или чем это отличается от того, что вы задали в вопросе выше. Не могли бы вы пояснить?
3. конечно. Я имею в виду переопределить фокус. чтобы отключить блокировку. вместо создания пользовательского messagebox
4. @AleaLindemann: Как указано выше … Нет. Приложение фокусируется на окне сообщения до тех пор, пока оно не будет отклонено. Согласно документации : «Это модальное окно, блокирующее другие действия в приложении, пока пользователь не закроет его».
5. @david Дэвид при попытке реализовать ваше решение я получил несколько ошибок. Я использую .Net Core 3.1.7. imgur.com/a/hevR3QA