一直以来,我都习惯于在显示窗体时,在不使用MDI方式,要么子窗体与父窗体可以同级, 只是让另一个窗体蹦出来而已,这就是非模态; 要么蹦出来的窗体就让父窗体停在那边,什么事也做不了,必须要等这个子窗体结束才能动弹,这就是模态.
但只有有这两种方式有点不够用.我希望创建出来的子窗体,它的行为像模态,始终放在父窗体的前面,注意不是所有窗体的前面.但是又不会影响父窗体做自己的事情.
还是一个一个来看.先假定有一个父窗体ParentForm,它的子窗体为ChildForm,按照模态来看,可以这样使用ChildForm.ShowDiaog();按非模态呢就是ChildForm.Show();
那么如何使一个窗体的行为像模态而又不会影响父窗体的执行呢?
通过窗体之间的交互是可以实现的.这种交互呢,就需要在创建子窗体的时候,传入父窗体自身或是借助第三方的类或接口.然后在子窗体里面进行回调.举例来说:
ChildForm form = new ChildForm(parentForm);
form.ShowDialog();
在子窗体中就可以回调父窗体的方法.但是如果希望在ShowDialog()方法后,我们还想做一些操作,而该操作又不希望被子窗体的出现而打断,这个方法就不可行了.
另一个方法就是弹出子窗体后,让父窗体处于无效状态,并且不会在意子窗体的返回信息.
ChildForm form = new ChildForm();
this.Enabled = false;
form.Show();
...
form.Close();
this.Enabled = true;
这样子窗体就可以始终在父窗体的前面,并且也不会耽误父窗体当前方法的执行.
上面这两种方法,都有一个共同点,就是子窗体出现的时候,父窗体都无法获得输入焦点.当在子窗体出现的情况下,我们还想在父窗体中输入一些值或是做一些其它操作,就不可行了.
一个改进的方法,就是使上面两者想结合.例如:
ChildForm form = new ChildForm(parentForm)
this.Enabled = false;
form.ShowDialog();
在子窗体中可以让父窗体的状态变为有效. 这样父窗体也可以获得输入焦点了.不过有得必有失啊, 这样的结果就是父窗体中当前方法在子窗体出现时,无法再继续进行下去.