因为工作中出现的问题,来记录一下涉及到的模态和非模态对话框
简要介绍一下两个的区别:
非模态对话框 | 模态对话框 | |
---|---|---|
调用窗口方式 | 窗体实例化对象.show() | 窗体实例化对象.showdialog() |
弹出后 | 可以切换到其他界面 | 未关闭前不能切换到其他界面 |
关闭后 | 自动释放资源,托管方式进行垃圾回收;DialogResult.ToStrring()==None; | 仅隐藏窗体,不会主动释放资源,不会被主动垃圾回收;DialogResult.ToString()==Cancel;窗体对象.Visiable=false |
其他 | 调用show()之后即可继续执行其他操作 | 关闭对话框后,才执行函数后面的操作 |
需要注意的是,如果关闭对话框后仍需要调用对话框中变量,需要用模态对话框;在考虑保留对话框数据信息,仅是想隐藏对话框时使用模态对话框,关闭时也可以调用this.Hide()也可不调用。简易代码如下:
namespace FileOpen //主界面
{
public partial class OpenFile : Form
{
public OpenFile()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ShowDialog openDialog = new ShowDialog();
openDialog.ShowDialog();
MessageBox.Show(openDialog.DialogResult.ToString());
if (openDialog.Visible.ToString().ToLower() == "false")
{
MessageBox.Show("模态窗体关闭后Visible为False,并未释放");
}
}
private void button2_Click(object sender, EventArgs e)
{
ShowDlg openDlg = new ShowDlg();
openDlg.Show();
MessageBox.Show(openDlg.DialogResult.ToString());
}
}
}
namespace FileOpen
{
public partial class ShowDialog : Form//模态对话框
{
public ShowDialog()
{
InitializeComponent();
}
private void ShowDialog_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("模态窗体关闭后DialogResult为" + this.DialogResult.ToString());
}
}
}
namespace FileOpen
{
public partial class ShowDlg : Form//非模态对话框
{
public ShowDlg()
{
InitializeComponent();
}
private void ShowDlg_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("非模态窗体关闭后DialogResult为" + this.DialogResult.ToString());
}
}
}