最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# WinFrom中show和ShowDialog的區(qū)別詳解

 更新時(shí)間:2026年02月01日 13:33:26   作者:張謹(jǐn)?shù)W  
想了解 C# WinForm 里Show()和ShowDialog()的核心區(qū)別,這兩個(gè)方法都是用來(lái)顯示窗體的,最關(guān)鍵的差異是是否為「模態(tài)窗體」,下面用通俗解釋 + 表格對(duì)比 + 實(shí)際代碼示例講清楚,新手也能直接套用,需要的朋友可以參考下

引言

想了解 C# WinForm 里Show()ShowDialog()的核心區(qū)別,這兩個(gè)方法都是用來(lái)顯示窗體的,最關(guān)鍵的差異是是否為「模態(tài)窗體」,連帶會(huì)影響代碼執(zhí)行是否阻塞、窗體交互規(guī)則、資源釋放等,下面用通俗解釋 + 表格對(duì)比 + 實(shí)際代碼示例講清楚,新手也能直接套用,同時(shí)補(bǔ)充開(kāi)發(fā)中必知的使用細(xì)節(jié)和場(chǎng)景選擇。

一、核心概念先理清

先明確兩個(gè)核心術(shù)語(yǔ),理解后區(qū)別就懂了一半:

  • 非模態(tài)窗體(Show():新打開(kāi)的窗體和原窗體(父窗體)是「平級(jí)」的,能自由切換、同時(shí)操作,比如軟件的「日志窗口」「輔助工具欄」。
  • 模態(tài)窗體(ShowDialog():新打開(kāi)的窗體是「獨(dú)占」的,必須先關(guān)閉這個(gè)窗體,才能回到原窗體操作,比如軟件的「登錄窗口」「保存文件對(duì)話框」「提示彈窗」。

二、核心區(qū)別直觀對(duì)比(開(kāi)發(fā)選方法的核心依據(jù))

對(duì)比維度Show()(非模態(tài))ShowDialog()(模態(tài))
窗體交互新窗體和父窗體可自由切換、同時(shí)操作只能操作當(dāng)前新窗體,關(guān)閉后才能操作父窗體
代碼執(zhí)行調(diào)用后立即執(zhí)行后續(xù)代碼(不阻塞)調(diào)用后阻塞后續(xù)代碼,關(guān)閉窗體才繼續(xù)執(zhí)行
窗體歸屬無(wú)強(qiáng)制父窗體,需手動(dòng)設(shè)置Owner才關(guān)聯(lián)自動(dòng)關(guān)聯(lián)調(diào)用的父窗體(也可手動(dòng)傳IWin32Window
返回值void(無(wú)返回值)DialogResult(枚舉,返回窗體關(guān)閉結(jié)果,如確定 / 取消 / 關(guān)閉)
資源釋放關(guān)閉后窗體實(shí)例仍存在,需手動(dòng)Dispose()關(guān)閉后會(huì)自動(dòng)釋放資源(推薦使用)
窗口層級(jí)普通層級(jí),可能被其他窗體遮擋頂層層級(jí),始終在父窗體上方,不會(huì)被遮擋

三、實(shí)際代碼示例(直接復(fù)制可用)

新建 WinForm 項(xiàng)目,放兩個(gè)ButtonbtnShow、btnShowDialog),再新建一個(gè)測(cè)試窗體Form2,分別演示兩個(gè)方法的使用,直觀看到差異。

1.Show()用法(非模態(tài))

// 按鈕btnShow的點(diǎn)擊事件
private void btnShow_Click(object sender, EventArgs e)
{
    // 實(shí)例化新窗體
    Form2 frm2 = new Form2();
    // 【可選】手動(dòng)設(shè)置父窗體,讓frm2始終在當(dāng)前窗體上方(不設(shè)置則可隨意拖動(dòng))
    frm2.Owner = this;
    // 顯示非模態(tài)窗體
    frm2.Show();
 
    // 關(guān)鍵:Show()調(diào)用后,立即執(zhí)行這行代碼(不阻塞)
    MessageBox.Show("Show()執(zhí)行后,直接彈出這個(gè)提示,F(xiàn)orm2和當(dāng)前窗體可同時(shí)操作");
}

2.ShowDialog()用法(模態(tài))

// 按鈕btnShowDialog的點(diǎn)擊事件
private void btnShowDialog_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    // 顯示模態(tài)窗體,接收返回值(DialogResult)
    DialogResult result = frm2.ShowDialog(this); // this是父窗體,可選參數(shù)
 
    // 關(guān)鍵:ShowDialog()調(diào)用后,代碼阻塞,關(guān)閉Form2才會(huì)執(zhí)行后續(xù)代碼
    // 根據(jù)返回值做不同邏輯處理(開(kāi)發(fā)中常用)
    if (result == DialogResult.OK)
    {
        MessageBox.Show("你點(diǎn)擊了Form2的「確定」按鈕");
    }
    else if (result == DialogResult.Cancel)
    {
        MessageBox.Show("你點(diǎn)擊了Form2的「取消」按鈕/關(guān)閉按鈕");
    }
}

3. 給 Form2 加按鈕,設(shè)置返回值(配套 ShowDialog ())

Form2放兩個(gè)ButtonbtnOK、btnCancel),設(shè)置點(diǎn)擊事件,指定DialogResult,關(guān)閉時(shí)會(huì)把結(jié)果返回給父窗體:

// Form2的「確定」按鈕
private void btnOK_Click(object sender, EventArgs e)
{
    // 設(shè)置窗體返回值為OK,同時(shí)自動(dòng)關(guān)閉窗體
    this.DialogResult = DialogResult.OK;
}
 
// Form2的「取消」按鈕
private void btnCancel_Click(object sender, EventArgs e)
{
    // 設(shè)置窗體返回值為Cancel,同時(shí)自動(dòng)關(guān)閉窗體
    this.DialogResult = DialogResult.Cancel;
}

注意:設(shè)置this.DialogResult后,窗體會(huì)自動(dòng)關(guān)閉,無(wú)需再調(diào)用Close()。

四、開(kāi)發(fā)中必知的使用細(xì)節(jié)

Show()的坑:避免重復(fù)實(shí)例化如果多次點(diǎn)擊btnShow,會(huì)打開(kāi)多個(gè)Form2,因?yàn)槊看吸c(diǎn)擊都新建了實(shí)例。解決方法:單例化窗體判斷窗體是否已打開(kāi)

ShowDialog()的返回值枚舉常用的DialogResult值:OK、Cancel、YesNo、AbortRetry、Ignore、None(默認(rèn)),可直接給按鈕的DialogResult屬性賦值(設(shè)計(jì)器中直接設(shè)置,無(wú)需寫代碼)。

模態(tài)窗體的關(guān)閉方式除了設(shè)置DialogResult,也可調(diào)用Close(),但此時(shí)返回值為DialogResult.Cancel;如果想關(guān)閉窗體但不返回任何值,可設(shè)置this.DialogResult = DialogResult.None。

非模態(tài)窗體的資源釋放Show()打開(kāi)的窗體,關(guān)閉后實(shí)例還在內(nèi)存中,長(zhǎng)期使用會(huì)造成內(nèi)存泄漏,建議在窗體的FormClosed事件中手動(dòng)釋放:

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

五、場(chǎng)景選擇(開(kāi)發(fā)中怎么選?)

ShowDialog()的場(chǎng)景(絕大多數(shù)業(yè)務(wù)彈窗)

  • 需要用戶必須處理完當(dāng)前窗體才能繼續(xù)操作(如登錄、注冊(cè)、修改信息);
  • 彈窗需要返回結(jié)果(如確定 / 取消保存、選擇文件 / 路徑);
  • 臨時(shí)的提示、確認(rèn)、輸入窗口(如消息框、輸入框)。

Show()的場(chǎng)景(輔助性窗口)

  • 軟件的常駐輔助窗口(如日志查看、數(shù)據(jù)監(jiān)控、工具欄);
  • 允許用戶同時(shí)操作多個(gè)窗體(如多文檔編輯 MDI、多標(biāo)簽頁(yè)輔助窗口);
  • 無(wú)需返回結(jié)果、隨時(shí)可以關(guān)閉的窗口。

總結(jié)

  1. Show()非模態(tài),不阻塞代碼、可多窗體同時(shí)操作,需手動(dòng)處理實(shí)例和資源,適合輔助窗口;
  2. ShowDialog()模態(tài),阻塞代碼、獨(dú)占交互,自動(dòng)返回結(jié)果并釋放資源,適合業(yè)務(wù)彈窗、確認(rèn)窗口;
  3. 開(kāi)發(fā)中優(yōu)先用ShowDialog()(更安全、無(wú)需手動(dòng)管理資源),僅在需要多窗體同時(shí)操作時(shí)用Show(),并做好單例和資源釋放處理。

以上就是C# WinFrom中show和ShowDialog的區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于C# show和ShowDialog區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#用匿名方法定義委托的實(shí)現(xiàn)方法

    C#用匿名方法定義委托的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#用匿名方法定義委托的實(shí)現(xiàn)方法,涉及C#匿名方法與委托的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#中4種深拷貝方法介紹

    C#中4種深拷貝方法介紹

    這篇文章主要介紹了C#中4種深拷貝方法介紹,本文講解了利用反射實(shí)現(xiàn)、利用xml序列化和反序列化實(shí)現(xiàn)、利用二進(jìn)制序列化和反序列化實(shí)現(xiàn)、利用silverlight DataContractSerializer實(shí)現(xiàn),用于在silverlight 客戶端使用等4種方法,需要的朋友可以參考下
    2015-06-06
  • c#基于Redis實(shí)現(xiàn)輕量級(jí)消息組件的步驟

    c#基于Redis實(shí)現(xiàn)輕量級(jí)消息組件的步驟

    這篇文章主要介紹了c#基于Redis實(shí)現(xiàn)輕量級(jí)消息組件的步驟,幫助大家更好的理解和學(xué)習(xí)使用c#進(jìn)行開(kāi)發(fā),感興趣的朋友可以了解下
    2021-05-05
  • 使用C#實(shí)現(xiàn)自己封裝的Modbus工具類庫(kù)

    使用C#實(shí)現(xiàn)自己封裝的Modbus工具類庫(kù)

    Modbus通訊協(xié)議在工控行業(yè)的應(yīng)用是很多的,并且也是上位機(jī)開(kāi)發(fā)的基本技能之一,所以本文主要為大家介紹了如何使用C#封裝一個(gè)Modbus工具類庫(kù),需要的可以參考下
    2024-02-02
  • C#實(shí)現(xiàn)鼠標(biāo)拖拽無(wú)邊框浮動(dòng)窗體的方法

    C#實(shí)現(xiàn)鼠標(biāo)拖拽無(wú)邊框浮動(dòng)窗體的方法

    一般情況下,在標(biāo)題欄中按住鼠標(biāo)左鍵不放即可實(shí)現(xiàn)拖動(dòng)操作,當(dāng)做浮動(dòng)窗體時(shí),如果包含窗體邊框,那么界面給使用者的感覺(jué)將很不友好,因此本文給大家介紹了C#實(shí)現(xiàn)鼠標(biāo)拖拽無(wú)邊框浮動(dòng)窗體的方法,感興趣的朋友可以參考下
    2024-04-04
  • C#形狀原點(diǎn)變換的方法

    C#形狀原點(diǎn)變換的方法

    這篇文章主要介紹了C#形狀原點(diǎn)變換的方法,涉及C#圖形繪制中原點(diǎn)變換的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • C#中nameof用法和應(yīng)用場(chǎng)景實(shí)現(xiàn)

    C#中nameof用法和應(yīng)用場(chǎng)景實(shí)現(xiàn)

    在 C# 中,nameof是一個(gè)上下文關(guān)鍵字,用于在編譯時(shí)獲取,并以字符串形式返回,下面就來(lái)具體介紹一下如何使用,感興趣的可以了解一下
    2025-11-11
  • C# 9.0 特性全面總結(jié)

    C# 9.0 特性全面總結(jié)

    這篇文章主要介紹了C# 9.0 特性的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C# 未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例

    C# 未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例

    c#開(kāi)發(fā)過(guò)程中出現(xiàn)未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例,錯(cuò)誤一般是下面的原因,軟件中也是因?yàn)闆](méi)有獲取到數(shù)據(jù)導(dǎo)致,需要的朋友可以參考下
    2022-09-09
  • WinForm程序?qū)崿F(xiàn)在線更新軟件功能的具體步驟

    WinForm程序?qū)崿F(xiàn)在線更新軟件功能的具體步驟

    本文詳細(xì)介紹了WinForm程序LWH.exe實(shí)現(xiàn)遠(yuǎn)程升級(jí)的步驟:通過(guò)FTP服務(wù)器存放更新包,對(duì)比版本號(hào)后下載解壓替換文件,利用獨(dú)立更新工具完成升級(jí),實(shí)現(xiàn)軟件在線更新功能,需要的朋友可以參考下
    2025-05-05

最新評(píng)論

梓潼县| 吴堡县| 方山县| 南木林县| 泸定县| 重庆市| 林口县| 边坝县| 淮南市| 高邑县| 闻喜县| 三原县| 环江| 米易县| 交口县| 鱼台县| 牟定县| 方正县| 习水县| 顺昌县| 鹤峰县| 扬中市| 无极县| 贞丰县| 隆德县| 巢湖市| 巴里| 大庆市| 玉龙| 如东县| 格尔木市| 芒康县| 商都县| 桃园县| 禄丰县| 陆川县| 武穴市| 绥宁县| 高阳县| 德昌县| 大悟县|