-
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程序开发过程中常见的页面切换的方式。