首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# WinForms 切換視窗:Show 新視窗 + Hide 舊視窗 (隱藏) 或 Close + 新執行緒 Run (關閉)

     編輯:程式設計綜合問答

場景一:隱藏舊視窗,稍後可能返回 (最常用)


// Form1 按鈕點擊
private void btnOpenForm2_Click(object sender, EventArgs e) {
    Form2 frm2 = new Form2();
    frm2.Show();        // 顯示新視窗 (非模態)
    this.Hide();        // 隱藏當前視窗,不銷毀,資源保留
}

// Form2 關閉時可選擇重新顯示 Form1
private void Form2_FormClosed(object sender, FormClosedEventArgs e) {
    Application.OpenForms["Form1"]?.Show(); // 或傳遞 Form1 參考
}

場景二:關閉舊視窗,開啟新視窗為主視窗 (需新執行緒跑 Application.Run)


private void btnSwitch_Click(object sender, EventArgs e) {
    // 關閉當前視窗會結束 Application.Run,必須在新執行緒啟動新訊息迴圈
    Thread t = new Thread(() => {
        Application.Run(new Form2()); // 新執行緒獨立訊息泵
    });
    t.SetApartmentState(ApartmentState.STA); // WinForms 需 STA
    t.Start();
    this.Close(); // 關閉舊視窗,原訊息迴圈結束
}

注意:這會建立兩個獨立的 `Application.Run` 迴圈,**非標準單視窗應用架構**,可能導致 `Application.Exit()` 行為異常、資源釋放時機混亂。**強烈建議用場景一 (Hide/Show) 或單一主視窗 + UserControl 切換**。

最佳架構:單一 Form + 多 UserControl / Panel 切換


public partial class MainForm : Form {
    private UserControl currentView;
    public void SwitchView(UserControl newView) {
        if (currentView != null) panelContainer.Controls.Remove(currentView);
        currentView = newView;
        currentView.Dock = DockStyle.Fill;
        panelContainer.Controls.Add(currentView);
    }
}

總結

  • **暫時切換、需返回**:`frm2.Show(); this.Hide();`
  • **永久切換、不返回**:`this.Close();` + **單一主視窗架構切換 UserControl** (最佳),或新執行緒 `Application.Run` (不推薦)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved