今天做了个MDI窗体,发现三个问题:
1、MDI子窗体是在主窗体的什么地方定义?我现在是在菜单单击事件中定义,这样便于集中管理,但同时也带来了父窗体不能控制主窗体的后果,例如父窗体不知道有多少子窗体。所以最好在主窗体中定义,并在初始化事件中设置其父窗体为this。在单击事件中调用即可。但同样烦恼的是:若在主窗体中定义,则主窗体创建过程会将子窗体全部创建,这显然会消耗系统资源。以后注意参照例子。
2、PB的MDI窗体,子窗体只能打开一次。但C#单击菜单后打开窗口A,再单击该菜单又可以打开第二个窗口A。如何处理?可以通过比较打开子窗口列表来实现,但太麻烦。
昨天刚好在学习设计模式,立马联想到singleton单件模式(限掉多次实例化同一个类),哈哈,singleton粉墨登场。
与第一感觉----通过外部控制相比,singleton是通过在类内部进行控制,实例化也由类自己实现,显然便于维护。下面是C#的源码:
public ChildForm : Form
{
private static ChildForm instance = null; //返回实例变量,注意为静态方法
protected ChildForm(){}; //将构造方法设为protected,强制外部类不能通过new来新建实例
public static ChildForm Instance() //创建实例,注意为静态方法
{
if (instance == null)
{
instance = new ChildForm();
return instance;
}
else
return null;
}
protected override void Dispose(bool disposing)
{
………………
instance = null; //注意这句不能漏
}
}
使用时: ChildForm child = ChildForm.Instance(); if (child != null) …………
3、若是MVC构架,是不是每一个菜单及按钮单击事件、都需要转化到一个专门的类来处理?若如此,则一些与界面有较强耦合的操作又当如何处理?如单击某个按钮,不仅会引发一些操作,而且会改变屏幕布局。这该如何处理呢?
思考中…………