在Windows Form平臺下實現視窗跳轉,常見的有以下幾種方式,比如通過Show/ShowDialog方法顯示新的視窗,通過多文檔界面(MDI)在父視窗中載入子視窗,或者是通關過在視窗中動態載入自定義控制項,比如通過將視窗中的Panel控制項作為容器,將一些自定義元素作為視圖界面控制項,動態載入到Pa ...
在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程式開發過程中常見的頁面切換的方式。