提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
原文来自
主要是为了记录自己使用C#时碰到的一些疑惑,方便以后使用的时候翻找和加深记忆
一、C#中showdialog与show的差异
在C#中窗口的显示有两种方式:模态显示(showdialog)和非模态显示(show)
二、区别
模态与非模态窗体的主要区别是窗体显示的时候是否可以操作其他窗体。模态窗体不允许操作其他窗体,非模态窗体可以操作其他窗体。
简单来讲就是使用(show)的时候可以操作其他窗体程序;而使用(showdialog)时其他窗体处于无法操作的状态
1.ShowDialog
模态显示后,
- 弹出窗口阻止调用窗口的所有消息响应。只有在弹出窗口结束后调用窗口才能继续。
- 在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码。
- 在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值。
**窗体显示为模式窗体时,单击“关闭”按钮会隐藏窗体,并将DialogResult属性设置为DialogResult.Cancel
与无模式窗体不同,当用户单击对话框的关闭窗体按钮或设置DialogResult属性的值时,不调用窗体的Close方法
实际上是把窗体的Visible属性赋值为false,隐藏窗体了
这样隐藏的窗体是可以重新显示,而不用创建该对话框的新实例 **
因为未关闭窗体,所以在应用程序不再需要该窗体时,请调用该窗体的Dispose方法
所以模态窗口在关闭时,不会调用close方法,也不调用dispose方法,窗口仍然存在,占有资源,所以可以继续获得窗口相关信息,在窗口不再使用时,需要手动释放
代码如下(示例):
testDialog.ShowDialog(); // 模态窗口关闭后,可以再次显示出来
testDialog.Dispose(); // 当模态窗口不再使用时,应该调用dispose方法释放资源
2.Show
非模态显示后,
- 可以在弹出窗口和调用窗口之间随意切换。
- 调用窗口调用show方法后,下面的代码可以立即执行。
- 在非模态窗口关闭后,窗口的所有资源被释放,窗口不存在,无法获取窗口的任何信息。
怎么判断一个窗体是模式窗体呢?
利用Form.Modal属性,如果该窗体是模式显示,则为true,否则为false
根据通过Show和ShowDialog而显示出来的窗体的Modal属性分别对应false和true
特别注意:
由于在窗体创建之前是无法得知显示方式的,所以在窗体构造函数中,Modal属性总是对应false,所以我们只能在Load事件中或者之后利用Modal属性值
怎么确定窗体间的所有者关系?
Form类的Owner属性:窗体的所有者
当一个窗体归另一窗体所有时,它便随着所有者窗体最小化和关闭。
例如,如果Form2归窗体Form1所有,则关闭或最小化Form1时,Form2也会关闭或最小化。
代码如下(示例):
private void button1_Click(object sender, EventArgs e)
{
Form2 mainForm = new Form2();
mainForm.StartPosition = FormStartPosition.CenterScreen;
mainForm.Location = new Point(500,500);
//mainForm.ShowDialog(this);
//或者 如果设置子府窗体,可以根据具体需求设置调用的方式
mainForm.Show(this);
//或者
//mainForm.Owner = this;
//mainForm.ShowDialog();
}