日期:2014-05-19  浏览次数:20914 次

C#中多个窗体之间的交互操作问题
窗体之间的关系
主窗体M
点击M上按钮显示窗体A(模式),点击A中按钮显示窗体B,点击B中按钮显示窗体C,点击C中按钮显示窗体D……
A <--> B <--> C <--> D <--> E……
B,C,D   窗体上均两个按钮   "返回 " "下一步 "   简单来说就是类似于安装软件是的各个界面。
从B返回A窗体时,A窗体中原信息依然存在。
同一时间,ABCDE只显示一个,其他掩藏。
实现如上功能,有什么办法是最好的,给点思路就行,给出几个主要的函数。
-------
我用handle   做的时候
A窗体点击 "下一步 "时
this.visible   =   false;
FormB   form   =   new   FormB(IntPtr   窗口A句柄);
form.ShowDialog();
B窗体点击 "上一步 "时
this.Visible   =   false;
FormA   form   =   Form.FromHandle(窗口A句柄);
form.ShowDialog();
-------
上面方法作的时候,次数多了就出错。
然后一个问题A掩藏   B显示的时候,主窗体M   却最小化了。

请高手给个解决的方法,(不一定用句柄)   谢谢啦




------解决方案--------------------
1 建立全局变量(可以是静态的)
Form[] g_myForms = new Form[]{
new Form1(),new Form2(),new Form3()
}
int g_nFormIndex = 0;

2 下一步时,myForms[g_nFormIndex].Hide(), g_nFormIndex++, myForms[g_nFormIndex].show()

3 如果点上一步,就myForms[g_nFormIndex].Hide(), g_nFormIndex--, myForms[g_nFormIndex].show()

这个控制我是放在一个主窗口中控制的
------解决方案--------------------
其实ls把原理说的差不多了

lz要是懂了ApplicationContext的含义的话,这个东西就非常easy了,在设计模式中也有一个东西lz可以用用,lz的做法可以说非常容易出错,非常不OO,变动性太差

我的想法是用一个链表之类的东西,将各个窗体对象存储其中,然后要有一个宿主管理这个链表,当窗体进行切换时,只需要在这个链表中进行切换就好了,还有是在ShowDialog()时,用异步的形式,这样就不需要用Visible这样的东西达到掩藏窗体的目的,而且窗体也真正的被销毁了,你那种Visible更改只是掩人耳目而已。

另一种设计考虑是,不要用那么多窗体,用用户控件就好,只需要一个主窗体,切换时,真正切换的是你的用户控件,方便多了,逻辑可以很好的分开


------解决方案--------------------
另一种设计考虑是,不要用那么多窗体,用用户控件就好,只需要一个主窗体,切换时,真正切换的是你的用户控件,方便多了,逻辑可以很好的分开

这个挺好的,我常用到这个,比如写几个panel的类,在主窗体按需求显示
------解决方案--------------------
既然用了面向对象来编写这个Windows程序
为何不用对象来编写
------解决方案--------------------
把窗体封装成静态的
Form[] g_myForms = new Form[]{
new Form1(),new Form2(),new Form3()
}
int g_nFormIndex = 0;

2 下一步时,myForms[g_nFormIndex].Hide(), g_nFormIndex++, myForms[g_nFormIndex].show()

3 如果点上一步,就myForms[g_nFormIndex].Hide(), g_nFormIndex--, myForms[g_nFormIndex].show()

这个控制我是放在一个主窗口中控制的