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

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

動態加載子控件
這種方式的實現與MDI的方式類似,我們先創建UC_Loging和UC_Home兩個自定義控件作為子頁面;然后創建一個容器窗口Form_Container,在Form_Container中放一個Panel控件作為子頁面的容器,通過將自定義控件綁定到panel實現頁面切換的效果。
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程序開發過程中常見的頁面切換的方式。
