需求

在我们现有的ERP应用中,他是基于WinForm设计的,在早期的设计中,我们每打开一个作业,就会新建一个窗口,就像这样:

当我们打开很多的作业时,用户要通过Windows的任务栏慢慢找到,当然,如果仅仅这个问题,到还能忍受。关键是用户会打开多个客户端,比如一个客户端登录A公司,另外一个客户端登陆B公司,就算我们在标题上添加公司信息,用户也需要时间反应,使用体验并不好。

解决方案

可能你首先想到MDI窗口,但你知道的,那是年代久远的东西,现在没有多少人愿意看到那个古老的界面风格了。

大多数人希望类似Chrome的风格。

制作这个控件本身不是难点,难点在于如何让以前的旧代码安全的运行?例如旧的代码中总是假设程序是运行在某个WinForm上,比如调用FindForm();

所以我的技巧是:

1、建立一个无边框的窗体(this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None),放一个TabControl;

2、当需要显示一个子窗口时,将他也设计为无边框,然后嵌入到TabPage中,类似这样:

Form2 f2 = new Form2();
f2.Dock = DockStyle.Fill;
f2.TopLevel = false;
TabPage p2 = new TabPage(f2.Text);
p2.Controls.Add(f2);
tabControl1.TabPages.Add(p2);
f2.Show();
tabControl1.SelectTab(p2);

其中f2就是潜入的窗口,这样看起来的效果就类似Chrome了,而且我执行FindForm是没有问题的。

示例代码下载

将多窗体应用程序改造为仿Chrome形式的简易方法的更多相关文章

  1. Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法

    最近在Delphi开发中用到了无边框窗体显示时,无法在任务栏使用右键弹出菜单的情况,经过整理,通过以下方法可以使右键菜单出现: procedure Tfrm_Base.InitSysMenu;var  ...

  2. Java Swing快速构建窗体应用程序

    以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...

  3. Windows窗体应用程序(非Console)使用libuv实现简单的异步WEB服务器

    libuv是一个很强大的异步处理框架(严格意义上不能叫框架,其实就是一组异步函数库,当然框架这东西有各种各样的定义和理解_^...),最初的的目的是用于NODEJS的异步处理,不过因为它是一个独立的项 ...

  4. C#开发Windows窗体应用程序的步骤

    使用C#开发应用程序时,一般包括创建项目.界面设计.设置属性.编写程序代码.保存项目.程序运行等6个步骤. 1.创建项目 在Visual Studio2017开发环境中选择“文件”→“新建”→“项目” ...

  5. C#WinForm窗体内Panel容器中嵌入子窗体、程序主窗体设计例子

    C#WinForm父级窗体内Panel容器中嵌入子窗体.程序主窗体设计例子 在项目开发中经常遇到父级窗体嵌入子窗体所以写了一个例子程序,顺便大概划分了下界面模块和配色,不足之处还望指点 主窗体窗体采用 ...

  6. 第一章 C#入门 (Windows窗体应用程序)(三)

    [案例] 编写一个Windows窗体应用程序,窗体上有一个文本框和两个按钮([显示]和[清除]按钮). 单击[显示]时,文本框的背景变为蓝色并且居中显示“努力学习C#”: 单击[清除]按钮,文本框的背 ...

  7. 第一章 C#入门(Windows窗体应用程序)(二)

    C#窗体应用程序(二) [案例]设计登录界面,效果如下: [案例实现步骤] 1.新建项目(Windows控制台应用程序 文件→新建→项目:选择“项目类型”为Visual C#,“模板”为Windows ...

  8. 第一章 C#入门 (Windows窗体应用程序)(一)

    我的第一个窗体应用程序(一) [案例说明]  在文本框中显示一行文字“Hello C#!”,单击[显示]按钮后在文本框中显示文字:单击[清除]按钮后清除文本框中的内容. [案例实现步骤] 1.新建项目 ...

  9. 窗体应用程序防腾讯QQ源码

    窗体应用程序防腾讯QQ源码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

随机推荐

  1. 2018.5.15Html标签初学

    body标签 -图标:&nbsp:(一个空格)&gt:(表示>)&lt:(表示<) -p标签:段落的划分 -br标签:换行 标签分为块级标签和行内标签. 块级标签: ...

  2. VScode中运行python程序,使用Code Runner插件

    把我的py文件加载在里面,想要运行一下. 可是...没有动静 于是我又到网上去查,原来要配置tasks.json,可我照着网上的方法弄好后还是没法运行,于是我便投入了code runner的怀抱 co ...

  3. Verify_Execute 验证SQL语句执行结果

    #region Verify_Execute /// <summary> /// 验证insert.update.delete执行 /// </summary> /// < ...

  4. 2.1JAVA基础复习——JAVA语言的基础组成注释和常量变量

    JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...

  5. 关于Oracle配置一些需要注意地方(IIS相关)

    说明:多重复,把各种坑走一次,并知道如何不走坑或者把坑填满,然后再复盘重新走一次,另外,你必须比一般人多付出一些,因为你起步慢了,另 外,你白天的效率不算高,精神状态不好,“试用期”就意味着有淘汰的可 ...

  6. Flutter中SQLite数据库的使用

    同时支持android和ios 支持事务和批量操作 支持插入/查询/更新/删除操作 在iOS和Android上的后台线程中执行数据库操作 1.添加依赖 dependencies: ... sqflit ...

  7. 使用AtomicLong,经典银行账户问题

    1.新建Account类,使用AtomicLong定义账户余额,增加和减少金额方法使用getAndAdd方法. package com.xkzhangsan.atomicpack.bank; impo ...

  8. javaweb闲暇小程序之抽签程序

    学自潭州学院视频 主程序页面截图 <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...

  9. 浅谈Vue之双向绑定

    VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的.那么Object.defineP ...

  10. 20175312 2018-2019-2 实验一《Java开发环境的熟悉》实验报告

    20175312 2018-2019-2 实验一<Java开发环境的熟悉>实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试J ...