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,通常我会这样做:
-
我用表单实例创build一个静态variables:
私有静态Form1 myform;
-
在线程中,我调用操作来显示主线程中的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是服务器本地的本地控件。 直到在服务器上显示的消息框上单击“确定”,它才会响应。