C# WinForm 防止子窗口重复弹出

本文介绍了如何在C# WinForm应用程序中避免子窗口重复弹出的问题。通过设置全局变量并在创建新窗口时进行判断,确保点击同一菜单项只会激活已存在的窗口而非创建新的实例。
部署运行你感兴趣的模型镜像

C# WinForm程序如何防止子窗口重复弹出

问题描述:

        主程序菜单中点击子菜单会弹出子窗口,但当第一个子窗口已经弹出后,再点击该子菜单依然会新弹出第二个相同的子窗口。而我们经理希望的是当再点击子菜单时不会产生新的子窗口,而是将已产生的第一个子窗口激活并出现在最前面(获得焦点)。

解决思路:

        1、用ShowDialog代替Show。

        ShowDialog会使子窗口屏蔽父窗口的所有功能,即只有子窗口有焦点。有时候这样处理很方便,但不是现在我们需要的。

        2、互斥体模式。

        不知是否有大材小用之嫌,涉及程序线程了,我未做细究。

        3、设置全局变量,在产生新窗口时做判断。(本例采用这个思路)

        关键实现代码参看下面代码部分。

问题重现:

        假设现有一个主窗口Form1,里面有一个按钮btnNewForm(“产生新窗口");点击该按钮将产生一个新子窗口NewForm,NewForm窗体里有一个介绍标签和一个”返回“按钮。我们希望当点击”产生新窗口“按钮并弹出NewForm窗口后,再点击”产生新窗口“按钮时,不会再产生新子窗口,而是将刚产生的NewForm窗口重现出来。界面如图1、图2所示。

图1 Form1窗口

图2 NewForm窗口


参考代码:

private static NewForm newForm;

        /// <summary>
        /// 防止子窗口重复出现
        /// 此处不用ShowDialog,因为那样使父窗口不可用,会有很多限制与不方便;
        /// 本例关键是定义一个子窗口的全局变量,并作判断
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNewForm_Click(object sender, EventArgs e)
        {
            
            if (newForm == null || newForm.IsDisposed)
            {
                newForm = new NewForm();
                newForm.Show();
            }
            else
            {
                newForm.WindowState = FormWindowState.Normal;
                newForm.Activate();
            }
        }

参考资料: 参考资料1

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值