当前位置:网站首页 > 更多 > 涨姿势 > 正文

[每日一学] Winform开发笔记之不重复打开MDI子窗口。

作者:CC下载站 日期:2020-06-07 00:00:00 浏览:74 分类:涨姿势

昨天发现切换子窗口会出现闪屏等情况,而且还有点延迟,造成卡顿这样子,今早灵光一现,会不会是重复打开了,因为我之前都是直接填充整个父窗口,所以看不到,然后我就取消了Fill,发现还真的是这样,于是百度找了一下,解决方案,然后在CSDN看到了一篇文章,解决了我的问题。


需求描述:在MDI窗体中,子窗体只能被打开一次,如果已有窗体不会在重新创建窗体对象


1 窗体的创建

(1)创建mdi窗体:新建窗体将其名称更改为FormMain,属性IsMdiContainer设置为true


(2)创建子窗体1:新建窗体将其名称更改为childForm1


(3)创建子窗体1:新建窗体将其名称更改为childForm2


(4)增加菜单项tsmi_singleMode,其Text属性设置为单例模式子窗体


(5)增加菜单项tsmi_application,其Text属性设置为函数模式子窗体


(6)增加菜单项tsmi_foreach,其Text属性设置为函数模式子窗体


界面如下:

2 单例模式的实现

(1)在子窗体1中将其构造函数改成private;添加静态成员和静态变量

//私有构造函数
privatechildForm1()
{
InitializeComponent();
}
//私有静态类类型的成员变量
privatestaticchildForm1inquire=null;
//公有静态类型成员函数
publicstaticchildForm1GetWindows()
{
if(inquire==null&&inquire.IsDisposed)
{
inquire=newchildForm1();
}
returninquire;
}

2)父窗体MDI中的为tsmi_singleMode按钮添加Click事件:

privatevoidtsmi_singleMode_Click(objectsender,EventArgse)
{
childForm1cf1=childForm1.GetWindows();
cf1.MdiParent=this;
cf1.Show();
}

3 函数模式之Application.OpenForms实现

使用Application.OpenForms来判断是否创建新的子窗体

//使用Application搜集已经打开的子窗体;若找不到就创建;找到则显示

privatevoidtsmi_application_Click(objectsender,EventArgse)
{
foreach(FormfrminApplication.OpenForms)
{
if(frmisChildForm2)
{
frm.Activate();
frm.WindowState=FormWindowState.Normal;
return;
}
}
ChildForm2youForm=newChildForm2();
youForm.MdiParent=this;
youForm.Show();
}

4 函数模式实现之遍历this.MdiChildren子窗体实现

定义判断函数

privatevoidOpenChildForm(FormformChild)//formChild只是是实例化的但既没有设置为父窗体的子窗体也没有显示
{
boolisOpened=false;
foreach(Formforminthis.MdiChildren)
{
//如果要显示的子窗体已经在父窗体的子窗体数组数组中,我们就把新建的多余的formChild销毁

if(formChild.Name==form.Name)
{
form.Activate();//既然我们想新建但已经有了,那就把之前存在的激活并调到最前边来
form.WindowState=FormWindowState.Normal;//窗口大小为窗口模式
formChild.Dispose();
isOpened=true;//表示窗口已经打开

break;
}
}

if(!isOpened)//如果没打开
{
formChild.MdiParent=this;//设置为子窗体
formChild.Show();

}
}

添加点击事件

privatevoidtmsi_foreach_Click(objectsender,EventArgse)
{
childForm3cf3=newchildForm3();
cf3.Name="childForm3";
OpenChildForm(cf3);
}

5 总结

列举了三种实现方式,第一种将类定义为私有构造函数、私有静态成员和公有静态成员的单例模式来实现;方法二遍历Application.OpenForms判断子窗体是否打开;方法三,遍历this.MdiChildren判断子窗体是否存在

原文链接:https://blog.csdn.net/m1m2m3mmm/article/details/90551875


您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯