概念说明
1 模态窗口
打开模态窗口后,只要不关闭该窗口,鼠标焦点或者光标就会一直停留在该窗口上。只有关闭该窗口后,调用窗口才能继续。模态窗口关闭后,仍可以读取模态窗口中的信息,如窗口的返回状态等。
2 非模态窗口
打开非模态窗口后,仍可以操作调用窗口。关闭非模态窗口,该窗口将不复存在,会释放窗口的所有资源,所以无法得到该窗口的任何信息。
实例说明
1 建立Windows窗体程序ShowAndShowDialogExp,程序主画面包含两个按钮,用于打开模态窗口和非模态窗口(如下图所示)。
2 编写按钮的Click事件代码
private void button1_Click(object sender, EventArgs e)
{
Form frm1 = new Form();
frm1.Text = "我是模态窗口!";
frm1.ShowDialog();//打开模态窗口(对话框)
}
private void button2_Click(object sender, EventArgs e)
{
Form frm2 = new Form();
frm2.Text = "我是非模态窗口!";
frm2.Show();//打开非模态窗口(对话框)
}
3 运行代码,进行操作体验
4 实例结论
C#中使用Show()方法打开非模态窗口,使用ShowDialog()方法打开模态窗口。
想的更多点(不是我想多了)
修改前面按钮的Click事件代码,修改后的代码如下所示。
private void button1_Click(object sender, EventArgs e)
{
Form frm1 = new Form();
frm1.Text = "我是模态窗口!";
frm1.ShowDialog();//打开模态窗口(辍对话框)
MessageBox.Show(frm1.DialogResult.ToString());
}
private void button2_Click(object sender, EventArgs e)
{
Form frm2 = new Form();
frm2.Text = "我是非模态窗口!";
frm2.Show();//打开非模态窗口(对话框)
MessageBox.Show(frm2.DialogResult.ToString());
}
朋友,发现跟前面代码的区别了吗?
呵呵,仅仅加了一句输出弹出窗口的DialogResult属性值的代码而已。
再次执行代码,程序的运行情况是:
从程序执行情况我们了解到:
执行Show()方法后,后面的代码会立即执行;而执行ShowDialog()方法后,后面的代码需要等弹出窗口关闭后才能及时执行。
前面说到:模态窗口关闭后,仍可以读取模态窗口中的信息。
这主要是因为:当“关闭”模态窗口后,窗体并没有被真的被“关闭”,因为用户点击“关闭”按钮或者设置DialogResult属性值时,并没有调用窗体的Close方法,只是将窗体的Visible属性赋值为false,隐藏了窗体而已。这样隐藏的窗体是可以被重新显示的,且窗体资源并没有被释放。所以,在你真的不需要这个窗体时,一定要记得Dispose一下哦。
为了说明这一切,修改前面打开模态窗口的按钮Click事件代码。
private void button1_Click(object sender, EventArgs e) { Form frm1 = new Form(); frm1.Text = "我是模态窗口!"; frm1.ShowDialog();//打开模态窗口(对话框) MessageBox.Show(frm1.DialogResult.ToString()); frm1.Visible = true; }代码执行情况是:
就到这里了。
关于DialogResult 枚举,请参考:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.dialogresult.aspx