为什么C#/ .NET消息框不是模态的?
无意中,如果消息框在我们的主UI后面,那么主UI不会响应,直到我们单击OK(在我们的消息框上)。
除了创建自定义消息框之外,还有其他解决方法吗?
答案 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)
模式弹出窗口在技术上被定义为一个弹出框,它会中断应用程序的正常流程...不一定是一个停留在所有其他窗口顶部的弹出框,因此您描述的行为是正确的模态弹出窗口。
这是CodeProject上的一个项目,它试图模仿MessageBox样式Modal窗口的“always on top”功能:
答案 4 :(得分:5)
您可以使用owner参数指定实现IWin32Window interface的特定对象,将消息框放在前面。
消息框是模态对话框,这意味着除了模态窗体上的对象外,不会发生任何输入(键盘或鼠标单击)。程序必须隐藏或关闭模态表单(通常是响应某些用户操作)才能输入另一个表单。
答案 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,我通常会这样做:
我使用表单实例创建一个静态变量:
private static Form1 myform;
从线程中,我调用操作以显示主线程中的MessageBox:
myform.BeginInvoke((MethodInvoker)delegate(){MessageBox.Show(“Process finished!”,“Thread Process Information”,MessageBoxButtons.OK,MessageBoxIcon.Information);});
这只是我一直使用的“千篇一律”,对我来说非常适合。
答案 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是本地控件,它是服务器的本地控件。在服务器中显示的消息框中单击“确定”之前,它不会响应。