3種方法實(shí)現(xiàn)WindowsForm切換窗口
在Windows Form平臺下實(shí)現(xiàn)窗口跳轉(zhuǎn),常見的有以下幾種方式,比如通過Show/ShowDialog方法顯示新的窗口,通過多文檔界面(MDI)在父窗口中加載子窗口,或者是通關(guān)過在窗口中動態(tài)加載自定義控件,比如通過將窗口中的Panel控件作為容器,將一些自定義元素作為視圖界面控件,動態(tài)加載到Panel控件中。下面我們將簡單介紹這幾種方式
Show/ShowDialog
通過這兩種方法可以很簡單的實(shí)現(xiàn)窗口跳轉(zhuǎn),
Home home = new Home(); home.Show(); Home home = new Home(); home.ShowDialog();
通過Show方法可以顯示非模式窗體,實(shí)際是將窗口設(shè)置為窗體的頂級對象。顯示窗體等效于將Visible屬性設(shè)置為true。 調(diào)用Show方法后,Visible屬性返回一個true值,直到調(diào)用Hide方法為止。
而ShowDailog方法就是將窗體顯示為一個模式對話框。只有將對話框關(guān)閉之后才會執(zhí)行之后的代碼。
Home home = new Home();
home.Show();
//home.ShowDialog();
Debug.WriteLine("彈出Home窗口");//使用Show方法時,程序顯示窗口后會繼續(xù)執(zhí)行輸出代碼,而ShowDialog只有將顯示的窗口關(guān)閉后才會繼續(xù)執(zhí)行
MDI窗口
這種方式實(shí)際上是通過創(chuàng)建一個MDI父窗口容器,然后讓各個子窗口顯示到父窗口容器中。
首先我們需要將父窗口的IsMdiContainer屬性設(shè)置為True(確定是否將窗口設(shè)置為MDI容器),然后具體的跳轉(zhuǎn)代碼如下
// 加載登錄窗口
private void Form_Container_Load(object sender, EventArgs e)
{
Login login = new Login();
login.MdiParent = this;
login.Show();
}
// 登錄實(shí)現(xiàn)
private void button1_Click(object sender, EventArgs e)
{
// 賬號密碼驗(yàn)證
// ...
Home home = new Home();
home.MdiParent = this.MdiParent;
home.Show();
}

從上圖中,如果根據(jù)平時的一些軟件開發(fā)需求,我們看到這樣的顯示是有一些問題的,比如,登錄和主菜單頁面重疊顯示,子頁面帶有邊框等等。
在子窗口的加載事件中,增加窗口邊框的處理如下
private void Login_Load(object sender, EventArgs e)
{
this.FormBorderStyle = FormBorderStyle.None;//將窗口設(shè)置無邊框模式,即去掉邊框和最大化等按鈕
this.WindowState = FormWindowState.Maximized;//將子窗口設(shè)置為最大化,即在父容器中起到居中的效果
}
通過單例模式,創(chuàng)建一個全局容器實(shí)例,并提供一個公共的子窗口加載方法
static Form_Container instance;
public static Form_Container Instance
{
get
{
if (instance == null)
{
instance = new Form_Container();
}
return instance;
}
}
public void LoadChildPage(Form form)
{
// 每次加載子窗口的時候關(guān)閉其他窗口
foreach (var item in instance.MdiChildren)
{
item.Close();
}
form.MdiParent = instance;
form.Show();
}
現(xiàn)在我們可以通過下面的方式進(jìn)行子頁面的切換
Form_Container.Instance.LoadChildPage(new Login()); Form_Container.Instance.LoadChildPage(new Home());

動態(tài)加載子控件
這種方式的實(shí)現(xiàn)與MDI的方式類似,我們先創(chuàng)建UC_Loging和UC_Home兩個自定義控件作為子頁面;然后創(chuàng)建一個容器窗口Form_Container,在Form_Container中放一個Panel控件作為子頁面的容器,通過將自定義控件綁定到panel實(shí)現(xiàn)頁面切換的效果。
public partial class Form_Container : Form
{
public Form_Container()
{
InitializeComponent();
}
static Form_Container instance;
public static Form_Container Instance
{
get
{
if (instance == null)
{
instance = new Form_Container();
}
return instance;
}
}
public Panel PnlContainer
{
get { return pnlContainer; }
set { pnlContainer = value; }
}
public void LoadChildPage(Control control)
{
PnlContainer.Controls.Clear();
PnlContainer.Controls.Add(control);
}
private void Form_Container_Load(object sender, EventArgs e)
{
Form_Container.Instance.LoadChildPage(new UC_Login());
}
}

以上就是在Windows Form程序開發(fā)過程中常見的頁面切換的方式。
到此這篇關(guān)于3種方法實(shí)現(xiàn)WindowsForm切換窗口的文章就介紹到這了,更多相關(guān)WindowsForm切換窗口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#查詢SqlServer數(shù)據(jù)庫并返回單個值的方法
這篇文章主要介紹了C#查詢SqlServer數(shù)據(jù)庫并返回單個值的方法,涉及C#操作SQLServer數(shù)據(jù)庫查詢的相關(guān)技巧,需要的朋友可以參考下2015-06-06
C#開發(fā)微信門戶及應(yīng)用(2) 微信消息處理和應(yīng)答
文章主要為大家詳細(xì)介紹了C#開發(fā)微信門戶及應(yīng)用第二篇,微信消息處理和應(yīng)答,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
C#常用數(shù)據(jù)結(jié)構(gòu)棧的詳細(xì)介紹
在C#中,Stack<T> 是一個后進(jìn)先出(LIFO,Last-In-First-Out)集合類,位于System.Collections.Generic 命名空間中,本文詳細(xì)介紹C#常用數(shù)據(jù)結(jié)構(gòu)棧,感興趣的朋友跟隨小編一起看看吧2024-09-09
C# 數(shù)據(jù)驗(yàn)證Regex示例詳解
文章介紹了C#中使用Regex進(jìn)行數(shù)據(jù)驗(yàn)證的方法,包括整數(shù)和小數(shù)的正負(fù)驗(yàn)證,以及郵箱和身份證號的格式驗(yàn)證,感興趣的朋友一起看看吧2025-02-02

