C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# show和ShowDialog区别

C# WinFrom中show和ShowDialog的区别详解

作者:张謹礧

想了解 C# WinForm 里Show()和ShowDialog()的核心区别,这两个方法都是用来显示窗体的,最关键的差异是是否为「模态窗体」,下面用通俗解释 + 表格对比 + 实际代码示例讲清楚,新手也能直接套用,需要的朋友可以参考下

引言

想了解 C# WinForm 里Show()ShowDialog()的核心区别,这两个方法都是用来显示窗体的,最关键的差异是是否为「模态窗体」,连带会影响代码执行是否阻塞、窗体交互规则、资源释放等,下面用通俗解释 + 表格对比 + 实际代码示例讲清楚,新手也能直接套用,同时补充开发中必知的使用细节和场景选择。

一、核心概念先理清

先明确两个核心术语,理解后区别就懂了一半:

二、核心区别直观对比(开发选方法的核心依据)

对比维度Show()(非模态)ShowDialog()(模态)
窗体交互新窗体和父窗体可自由切换、同时操作只能操作当前新窗体,关闭后才能操作父窗体
代码执行调用后立即执行后续代码(不阻塞)调用后阻塞后续代码,关闭窗体才继续执行
窗体归属无强制父窗体,需手动设置Owner才关联自动关联调用的父窗体(也可手动传IWin32Window
返回值void(无返回值)DialogResult(枚举,返回窗体关闭结果,如确定 / 取消 / 关闭)
资源释放关闭后窗体实例仍存在,需手动Dispose()关闭后会自动释放资源(推荐使用)
窗口层级普通层级,可能被其他窗体遮挡顶层层级,始终在父窗体上方,不会被遮挡

三、实际代码示例(直接复制可用)

新建 WinForm 项目,放两个ButtonbtnShowbtnShowDialog),再新建一个测试窗体Form2,分别演示两个方法的使用,直观看到差异。

1.Show()用法(非模态)

// 按钮btnShow的点击事件
private void btnShow_Click(object sender, EventArgs e)
{
    // 实例化新窗体
    Form2 frm2 = new Form2();
    // 【可选】手动设置父窗体,让frm2始终在当前窗体上方(不设置则可随意拖动)
    frm2.Owner = this;
    // 显示非模态窗体
    frm2.Show();
 
    // 关键:Show()调用后,立即执行这行代码(不阻塞)
    MessageBox.Show("Show()执行后,直接弹出这个提示,Form2和当前窗体可同时操作");
}

2.ShowDialog()用法(模态)

// 按钮btnShowDialog的点击事件
private void btnShowDialog_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    // 显示模态窗体,接收返回值(DialogResult)
    DialogResult result = frm2.ShowDialog(this); // this是父窗体,可选参数
 
    // 关键:ShowDialog()调用后,代码阻塞,关闭Form2才会执行后续代码
    // 根据返回值做不同逻辑处理(开发中常用)
    if (result == DialogResult.OK)
    {
        MessageBox.Show("你点击了Form2的「确定」按钮");
    }
    else if (result == DialogResult.Cancel)
    {
        MessageBox.Show("你点击了Form2的「取消」按钮/关闭按钮");
    }
}

3. 给 Form2 加按钮,设置返回值(配套 ShowDialog ())

Form2放两个ButtonbtnOKbtnCancel),设置点击事件,指定DialogResult,关闭时会把结果返回给父窗体:

// Form2的「确定」按钮
private void btnOK_Click(object sender, EventArgs e)
{
    // 设置窗体返回值为OK,同时自动关闭窗体
    this.DialogResult = DialogResult.OK;
}
 
// Form2的「取消」按钮
private void btnCancel_Click(object sender, EventArgs e)
{
    // 设置窗体返回值为Cancel,同时自动关闭窗体
    this.DialogResult = DialogResult.Cancel;
}

注意:设置this.DialogResult后,窗体会自动关闭,无需再调用Close()。

四、开发中必知的使用细节

Show()的坑:避免重复实例化如果多次点击btnShow,会打开多个Form2,因为每次点击都新建了实例。解决方法:单例化窗体判断窗体是否已打开

ShowDialog()的返回值枚举常用的DialogResult值:OKCancelYesNoAbortRetryIgnoreNone(默认),可直接给按钮的DialogResult属性赋值(设计器中直接设置,无需写代码)。

模态窗体的关闭方式除了设置DialogResult,也可调用Close(),但此时返回值为DialogResult.Cancel;如果想关闭窗体但不返回任何值,可设置this.DialogResult = DialogResult.None

非模态窗体的资源释放Show()打开的窗体,关闭后实例还在内存中,长期使用会造成内存泄漏,建议在窗体的FormClosed事件中手动释放:

frm2.FormClosed += (s, e) => frm2.Dispose(); 

五、场景选择(开发中怎么选?)

ShowDialog()的场景(绝大多数业务弹窗)

Show()的场景(辅助性窗口)

总结

  1. Show()非模态,不阻塞代码、可多窗体同时操作,需手动处理实例和资源,适合辅助窗口;
  2. ShowDialog()模态,阻塞代码、独占交互,自动返回结果并释放资源,适合业务弹窗、确认窗口;
  3. 开发中优先用ShowDialog()(更安全、无需手动管理资源),仅在需要多窗体同时操作时用Show(),并做好单例和资源释放处理。

以上就是C# WinFrom中show和ShowDialog的区别详解的详细内容,更多关于C# show和ShowDialog区别的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文