C#/ .NET消息框不是模式

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

不小心,如果消息框落在我们的主UI之后,那么主UI将不会响应,直到我们单击确定(在我们的消息框中)。

除了创build自定义消息框之外是否有解决方法?

您需要将MessageBox属性分配给主UI窗口(请参阅第3个构造函数)。

这是一个简单的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在答复中所说的 ,消息框是一个modal dialog。 指定“所有者”属性。 在这个例子中,所有者由关键字“this”表示。

一个模态popup在技术上定义为一个popup框,中断正常的应用程序stream…不一定是一个停留在所有其他窗口的顶部,所以你描述的行为是正确的模式popup。

模态窗口

这是CodeProject上的一个项目,它试图模仿MessageBox风格的Modal窗口的“always on top”function:

CodeProject:TopMost MessageBox

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

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

消息框是一个模式对话框,这意味着除了模态窗体上的对象之外,不会出现任何input(键盘或鼠标点击)。 在input到另一个表单之前,程序必须隐藏或closures模式表单(通常是响应某些用户操作)。

MessageBox.Show方法

这对我有用:

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

Form.ActiveForm会给你当前活动的表单,即使你从其他任何类提高你的MessageBox。

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

  1. 我用表单实例创build一个静态variables:

    私有静态Form1 myform;

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

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

这只是一个我常常使用的“cookies”,对我来说是完美的。

使消息框出现在主线程中,如果你的表单是从它创build的:

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

MessageBox是服务器本地的本地控件。 直到在服务器上显示的消息框上单击“确定”,它才会响应。