WindowsForm切換窗口的幾種常見實現


在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程序開發過程中常見的頁面切換的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM