c#模态对话框从内部退出_C#模态对话框和非模态对话框

模态对话框

弹出窗口阻止调用窗口的所有消息响应。

只有在弹出窗口结束后调用窗口才能继续。

在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值。

非模态对话框

可以在弹出窗口和调用窗口之间随意切换。

调用窗口调用show方法后,下面的代码可以立即执行。在非模态窗口关闭后,窗口的所有资源被释放,窗口不存在,无法获取窗口的任何信息。

所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框。非模态对话框则不会强制此种特性,用户可以在当前对话框以及其他窗口间进行切换

概念说明

1 模态窗口

打开模态窗口后,只要不关闭该窗口,鼠标焦点或者光标就会一直停留在该窗口上。只有关闭该窗口后,调用窗口才能继续。模态窗口关闭后,仍可以读取模态窗口中的信息,如窗口的返回状态等。

2 非模态窗口

打开非模态窗口后,仍可以操作调用窗口。关闭非模态窗口,该窗口将不复存在,会释放窗口的所有资源,所以无法得到该窗口的任何信息。

实例说明

1 建立Windows窗体程序ShowAndShowDialogExp,程序主画面包含两个按钮,用于打开模态窗口和非模态窗口(如下图所示)。

b157fe183197834e42e5525f804c6b3e.png

2 编写按钮的Click事件代码

private void button1_Click(objectsender, EventArgs e)

{

Form frm1= newForm();

frm1.Text= "我是模态窗口!";

frm1.ShowDialog();//打开模态窗口(对话框)

}private void button2_Click(objectsender, EventArgs e)

{

Form frm2= newForm();

frm2.Text= "我是非模态窗口!";

frm2.Show();//打开非模态窗口(对话框)

}

3 运行代码,进行操作体验

点击按钮“打开模态窗口”,打开模态窗口frm1,窗口标题栏显示“我是模态窗口!”,此时无法切换到调用窗口,当关闭该窗口后,又可以继续操作调用窗口了。

点击按钮“打开非模态窗口”,打开非模态窗口frm2,此时,可以仍切换到调用窗口操作调用窗口。

4 实例结论

C#中使用Show()方法打开非模态窗口,使用ShowDialog()方法打开模态窗口。

5 进阶

修改前面按钮的Click事件代码,修改后的代码如下所示。

private void button1_Click(objectsender, EventArgs e)

{

Form frm1= newForm();

frm1.Text= "我是模态窗口!";

frm1.ShowDialog();//打开模态窗口(辍对话框)

MessageBox.Show(frm1.DialogResult.ToString());

}private void button2_Click(objectsender, EventArgs e)

{

Form frm2= newForm();

frm2.Text= "我是非模态窗口!";

frm2.Show();//打开非模态窗口(对话框)

MessageBox.Show(frm2.DialogResult.ToString());

}

朋友,发现跟前面代码的区别了吗?

呵呵,仅仅加了一句输出弹出窗口的DialogResult属性值的代码而已。

再次执行代码,程序的运行情况是:

点击“打开模态窗口”打开模态窗口,接着关闭模态窗口,会弹出消息框,输出“Cancel”(frm1.DialogResult.ToString()的结果)。

点击“打开非模态窗口”打开非模态窗口后,便会弹出消息框,输出“None”(frm2.DialogResult.ToString()的结果)。

从程序执行情况我们了解到:

执行Show()方法后,后面的代码会立即执行;而执行ShowDialog()方法后,后面的代码需要等弹出窗口关闭后才能及时执行。

前面说到:模态窗口关闭后,仍可以读取模态窗口中的信息。

这主要是因为:当“关闭”模态窗口后,窗体并没有被真的被“关闭”,因为用户点击“关闭”按钮或者设置DialogResult属性值时,并没有调用窗体的Close方法,只是将窗体的Visible属性赋值为false,隐藏了窗体而已。这样隐藏的窗体是可以被重新显示的,且窗体资源并没有被释放。所以,在你真的不需要这个窗体时,一定要记得Dispose一下哦。

为了说明这一切,修改前面打开模态窗口的按钮Click事件代码。

private void button1_Click(objectsender, EventArgs e)

{

Form frm1= newForm();

frm1.Text= "我是模态窗口!";

frm1.ShowDialog();//打开模态窗口(对话框)

MessageBox.Show(frm1.DialogResult.ToString());

frm1.Visible= true;

}

代码执行情况是:

打开模态窗口后,关闭窗口,窗口隐藏,同时,弹出消息框,显示“Cancel”,接着,关闭消息框,模态窗口又被显示(frm1.Visible = true)。

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

吃瓜的小翻译

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值