创建具有模态行为的非模态窗体

本文探讨了在不完全模态也不完全非模态的情况下,如何实现在父窗体不停止运行的前提下,子窗体能始终保持在父窗体之上。文中介绍了几种实现方法及其优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模态和非模态窗体,耳熟能详.这里讨论一下具有模态行为的非模态对话框.

    一直以来,我都习惯于在显示窗体时,在不使用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();
    在子窗体中可以让父窗体的状态变为有效. 这样父窗体也可以获得输入焦点了.不过有得必有失啊, 这样的结果就是父窗体中当前方法在子窗体出现时,无法再继续进行下去. 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值