zoukankan      html  css  js  c++  java
  • 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程序开发过程中常见的页面切换的方式。

  • 相关阅读:
    java与C#区别1
    简单解决Linq多条件组合问题<转>
    散列表(哈希表)工作原理<转>
    在Eclipse中设置中文JavaDOC<转>
    Cucumber入门之_argument
    Cucumber入门之Gherkin
    网上常用免费WebServices集合
    watir学习baidu搜索示例
    使用Cucumber的15个建议
    Cucumber入门之_World
  • 原文地址:https://www.cnblogs.com/zhuanghamiao/p/WindowsForm-WindowSwitch.html
Copyright © 2011-2022 走看看