Могу ли я показать MessageBox, но все еще использовать форму?

#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