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

WindowsForm切换窗口的几种常见实现相关推荐

  1. linux与w7之间的切换,w7系统切换窗口怎么操作_教你w7系统切换窗口的几种方法

    在我我们的日常学习和工作中,为了方便我们能够快速的进行操作,通常都会使用切换窗口的方式来解决,这样既方便又节省时间.可是对于一些win7新用户来说,却不知道如何操作切换窗口的功能,对此,小编就在这里简 ...

  2. python如何切换windows窗口_selenium+python 切换窗口的几种方法

    第一种方法: 使用场景: 打开多个窗口,需要定位到新打开的窗口 使用方法: # 获取打开的多个窗口句柄 windows = driver.window_handles # 切换到当前最新打开的窗口 d ...

  3. selenium切换窗口的几种方法小结

    第一种方法 使用场景 打开多个窗口,需要定位到新打开的窗口: 使用方法: # 获取打开的多个窗口句柄 windows = driver.window_handles # 切换到当前最新打开的窗口 dr ...

  4. 高效程序员秘籍(1):使用AutoHotKey快速切换窗口

    当我们打开电脑做一些事后,任务栏中就会有若干已打开应用程序的窗口,在它们之间切换,绝大部分人使用下面两种方式: 1.使用Tab键     2.直接用鼠标在任务栏中找到目标窗口再点击   第一种方式效率 ...

  5. Dreamwear如何创建javascript_内存管理+如何处理4种常见的内存泄漏

    JavaScript是如何工作的:内存管理+如何处理4种常见的内存泄漏 潮水自会来去,但心志得坚若磐石.即便成不了那根定海神针,也至少不是那随意被拍上岸的野鬼游魂.by 一枚热汤圆 几周前,我们开始了 ...

  6. 9种常见的前端跨域解决方案

    9种常见的前端跨域解决方案(详解) 2019.09.02 21:54 73879浏览 一.什么是跨域?   在前端领域中,跨域是指浏览器允许向服务器发送跨域请求,从而克服Ajax只能同源使用的限制. ...

  7. Ubuntu下的几种常见输入法极其配置方式(zt)

    许多新人对于Ubuntu下的中文输入法都很不满意,因此,这次的文章就给大家大概讲解一下Ubuntu下的几种常见输入法.并推荐 几个我自己觉得不错的 一.基础知识:SCIM 1.定义 SCIM是一个广泛 ...

  8. oracle ora-各种常见java.sql.SQLException归结

    oracle ora-各种常见java.sql.SQLException归纳 java.sql.SQLException错误! ORA-00904:     --invalid column name ...

  9. 【特征提取+分类模型】4种常见的NLP实践思路

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈琰钰,清华大学,Datawhale成员 越来越多的人选择参加算法 ...

最新文章

  1. myeclipse的buildpath 和lib引入的区别
  2. 入门十大Python机器学习算法(附代码)
  3. python序列化详细教程
  4. 由浅到浅入门批量渲染(二)
  5. Activity-Service-Receiver-Provider
  6. 安卓事件机制与页面跳转
  7. java应用程序利用Exe4j打包exe文件
  8. centos-修改分辨率
  9. 配置多个git账号_一台电脑,两个及多个git账号配置
  10. ES9新特性_ES9正则扩展-dotAll模式---JavaScript_ECMAScript_ES6-ES11新特性工作笔记056
  11. Spring系列(一):Spring的基本概念及其核心
  12. 【Andorid学习】declare-styleable:自定义控件的属性
  13. [转]MySQL修改root密码的多种方法
  14. (进来补知识啦!)利用双四选一数据选择器74153实现十六选一数据选择器(包含74153简单解释)
  15. iapp进度条倒计时_倒计时进度条app
  16. 11 空间平面方程 : 参数方程、向量式方程、行列式方程、三点式方程、点法式方程、一般方程
  17. 七周数据分析01_数据分析思维
  18. opencv 手指位置检测
  19. Coggle打卡——Linux使用基础
  20. Python opencv 在图片上写字

热门文章

  1. JavaScript幸运数字游戏
  2. ENVI下的Landsat8图像融合
  3. Data too long for column ‘xxx‘ at row 1解决方法
  4. 打造绿色数据中心,Colt DCS 是认真的!
  5. DNS攻击流量识别思考
  6. 从美术生到程序员转型之路【我的故事】,2021年五面蚂蚁
  7. 牛客网在线编程专题《剑指offer-面试题39:题目二》判断是否是平衡二叉树
  8. 这篇文章告诉你音频降噪手机软件app有哪些?
  9. Oracle给查询结果从1到n添加序号
  10. linux安装微软字体