Подтвердить что ты не робот

С#/.NET messagebox не является модальным

Почему поле сообщения С#/.NET не является модальным?

Случайно, если окно сообщения идет за нашим основным пользовательским интерфейсом, тогда основной пользовательский интерфейс не отвечает, пока мы не нажмем OK (в нашем окне сообщения).

Существует ли обходное решение, отличное от создания настраиваемого окна сообщений?

4b9b3361

Ответ 1

Вам необходимо назначить свойство владельца MessageBox в главном окне пользовательского интерфейса (посмотрите на 3-й конструктор).

Ответ 2

Это простое приложение Windows Forms С#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string message = "You did not enter a server name. Cancel this operation?";
            string caption = "No Server Name Specified";
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result;

            // Displays the MessageBox.
            result = MessageBox.Show(this, message, caption, buttons);
            if (result == DialogResult.Yes)
            {
                // Closes the parent form.
                this.Close();
            }
        }
    }
}

Как Dusty заявляет в своем ответе, окно сообщения является модальным диалогом. Укажите свойство "владелец". В этом примере владелец обозначается ключевым словом 'this'.

Ответ 3

Чтобы установить системный модальный набор сообщений MessageBoxOptions.DefaultDesktopOnly.

Ответ 4

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

Модальное окно

Здесь проект CodeProject, который пытается имитировать функциональность "всегда сверху" для модального окна MessageBox:

CodeProject: TopMost MessageBox

Ответ 5

Вы можете использовать параметр owner, чтобы указать конкретный объект, который реализует интерфейс IWin32Window, чтобы разместить окно сообщения перед.

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

MessageBox.Show Method

Ответ 6

Сделать поле сообщения в основном потоке, если ваша форма была создана из него:

private bool ShowMessageBoxYesNo()
{
    if (this.InvokeRequired)
        return (bool)this.Invoke(new ShowMessageBoxYesNoDelegate(ShowMessageBoxYesNo));
    else
    {
        DialogResult res = MessageBox.Show("What ?", "Title", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (res == DialogResult.Yes)
            return true;
        else
            return false;
    }
}

Ответ 7

Это работает для меня:

MessageBox.Show(Form.ActiveForm,"Finished processing", "Process finished", , MessageBoxButtons.OK, MessageBoxIcon.Information);

Form.ActiveForm предоставит вам текущую активную форму, даже если вы поднимаете свой MessageBox из любого другого класса.

Ответ 8

Что я обычно делаю, если мне нужно вызвать MessageBox из другого потока (а не из основного потока):

  • Я создаю статическую переменную с экземпляром формы:

    закрытый статический Form1 myform;

  • Из потока я вызываю операцию, чтобы показать MessageBox из основного потока:

    myform.BeginInvoke((MethodInvoker) delegate() {MessageBox.Show( "Процесс закончен!", "Информация о процессе потока", MessageBoxButtons.OK, MessageBoxIcon.Information);});

Это просто "куки-резак", который я всегда использую, и отлично работает для меня.

Ответ 9

public static System.Windows.Forms.DialogResult WW_MessageBox(string Message, string Caption,
        System.Windows.Forms.MessageBoxButtons buttons, System.Windows.Forms.MessageBoxIcon icon,
        System.Windows.Forms.MessageBoxDefaultButton defaultButton)
    {
        System.Windows.Forms.MessageBox.Show(Message, Caption, buttons, icon, defaultButton,
            (System.Windows.Forms.MessageBoxOptions)8192 /*MB_TASKMODAL*/);

    }

Ответ 10

MessageBox - локальный элемент управления, локальный для сервера. И он не отвечает, пока не нажмете OK в окне сообщения, которое отображается на сервере.