|
|
<div id="cnblogs_post_body">大概受到了VB8(VS2003以上那个版本),或者是VB6的影响。初学者在使用C#时对于窗体之间的交互总是感到非常陌生,不易控制。本章节将介绍C#中(或者是VB7,也就是2003中那个不能直接像VB6一样通过&ldquo;窗体名.方法"实例化对象调用方法)如何使用面向对象的机制策略进行窗体交互。
当你在启动Word,Excel,乃至于Windows的时候不是直接进入界面(或者桌面)进行操作,而是先进入一个&ldquo;闪屏窗体&rdquo;&mdash;&mdash;先加载启动项(初始化程序,包括读取个人设置,硬件环境检测等)。如果你自己的程序有这些类似的特殊需求,或者说因为程序体积大而不愿意让读者等候许多时间,此时利用&ldquo;闪屏窗体&rdquo;加载环境项是一个非常不错的选择。现在问题在于:
1)因为&ldquo;闪屏窗体&rdquo;是主启动项,因此子窗体是在&ldquo;闪屏窗体&rdquo;启动加载内容完毕之后启动的,当客户关闭了&ldquo;主&rdquo;窗体&rdquo;之后闪屏窗体&ldquo;仍然存在&rdquo;,此时如果再次启动程序将在内存中&ldquo;二次加载&rdquo;闪屏窗体以及初始化内容,容易造成内存无法释放等诸多问题(这可以通过VS中用Debug调试运行得到证明&mdash;&mdash;假设有&ldquo;闪屏窗体&rdquo;和&ldquo;主窗体&rdquo;两个类,在&ldquo;闪屏窗体&rdquo;的Load事件中直接实例化&ldquo;主窗体&rdquo;,然后调用Show方法呈现&ldquo;主窗体&rdquo;,并且调用Hide方法隐藏&ldquo;闪屏窗体&rdquo;;此时你关闭了&ldquo;主窗体&rdquo;,再次编译会发生什么?)。
2)当把&ldquo;闪屏窗体&rdquo;设置为主窗体,使用定时器或者其它手段加载完必须项之后如何把这些内容传给另外一个与自己毫不相干的类(主窗体)进行处理?
其实这两类问题都是和OOP编程紧密相关(因为两个窗体说白了本质是类,是两个可以和用户进行UI交互的类而已,我们假设&ldquo;闪屏窗体&rdquo;是A类,&ldquo;主窗体&rdquo;是B类)。第一个问题的核心在于&ldquo;如何解决当&lsquo;子组件&rsquo;(包含于A类的B)关闭后,如何告知A也立即关闭(因为Hide只是隐藏不让读者看到,并不意味着窗体从内存中释放)&rdquo;?第二个问题更为明显&mdash;&mdash;如何把A类的信息传送给B,让B知道呢?
先解决第一个问题:
【基本思路】要让B关闭的同时A得到消息,A也自动关闭,这意味着B必须可以调用A的Close方法(也就是B可以控制A,换句话说亦是B引用A的实体),我们可以为B增加一个构造函数,接受A的实体;同时在B的Closing事件中关闭A,代码如下(您可以右键项目创建一个新的类文件,然后使用partial类的形式为Form类增添新的属性方法等):
[C#]
<div class="cnblogs_code">public partial class B{ //增加一个在B内部的私有属性,便于控制A private A A{get;set;} //原有的构造函数 public B() { InitializeComponent(); } //人为增加一个构造函数 public B(A a):this() { A = a; }} |
|