C#/ .NET messagebox不是模态的

时间:2009-07-20 15:15:30

标签: c# modal-dialog

为什么C#/ .NET消息框不是模态的?

无意中,如果消息框在我们的主UI后面,那么主UI不会响应,直到我们单击OK(在我们的消息框上)。

除了创建自定义消息框之外,还有其他解决方法吗?

10 个答案:

答案 0 :(得分:58)

您需要将MessageBox所有者属性分配给主UI窗口(查看第3个构造函数)。

答案 1 :(得分:12)

这是一个简单的C#新Windows窗体应用程序:

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 states in his answer,消息框是模态对话框。指定“所有者”属性。在此示例中,所有者由关键字“this”表示。

答案 2 :(得分:7)

要获取系统模态消息框 MessageBoxOptions.DefaultDesktopOnly

答案 3 :(得分:6)

模式弹出窗口在技术上被定义为一个弹出框,它会中断应用程序的正常流程...不一定是一个停留在所有其他窗口顶部的弹出框,因此您描述的行为是正确的模态弹出窗口。

Modal Window

这是CodeProject上的一个项目,它试图模仿MessageBox样式Modal窗口的“always on top”功能:

CodeProject: TopMost MessageBox

答案 4 :(得分:5)

您可以使用owner参数指定实现IWin32Window interface的特定对象,将消息框放在前面。

消息框是模态对话框,这意味着除了模态窗体上的对象外,不会发生任何输入(键盘或鼠标单击)。程序必须隐藏或关闭模态表单(通常是响应某些用户操作)才能输入另一个表单。

MessageBox.Show Method

答案 5 :(得分:0)

如果您的表单是通过它创建的,则使消息框出现在主线程中:

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;
    }
}

答案 6 :(得分:0)

这对我有用:

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

Form.ActiveForm会为您提供当前活动的表单,即使您从任何其他类提升MessageBox也是如此。

答案 7 :(得分:0)

如果我必须从另一个线程(而不是主线程)触发MessageBox,我通常会这样做:

  1. 我使用表单实例创建一个静态变量:

    private static Form1 myform;

  2. 从线程中,我调用操作以显示主线程中的MessageBox:

    myform.BeginInvoke((MethodInvoker)delegate(){MessageBox.Show(“Process finished!”,“Thread Process Information”,MessageBoxButtons.OK,MessageBoxIcon.Information);});

  3. 这只是我一直使用的“千篇一律”,对我来说非常适合。

答案 8 :(得分:-2)

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*/);

    }

答案 9 :(得分:-2)

MessageBox是本地控件,它是服务器的本地控件。在服务器中显示的消息框中单击“确定”之前,它不会响应。