You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Form2关闭事件中启用SHOP按钮的技术问题求助

解决点击器游戏商店按钮关闭后无法重新启用的问题

你遇到的核心问题是:打开Form2(商店界面)后禁用了button2,但Form2关闭时,Form1没有收到这个关闭通知,导致按钮一直处于禁用状态,isInGui的状态也没被重置。下面给你两种实用的解决方案:

方法一:使用模态对话框(简单直接)

如果你的商店窗口不需要和主窗口同时交互(比如商店打开时不能点击主界面的蛋糕),用ShowDialog()代替Show()是最省事的方式。这个方法会阻塞代码执行,直到Form2关闭,之后你就能直接重新启用按钮:

修改Form1的button2_Click方法:

public void button2_Click(object sender, EventArgs e)
{
    // 只有不在商店界面时才触发
    if (!isInGui)
    {
        // 使用using确保Form2被正确释放
        using (var secondForm = new WindowsFormsApplications2.Form2())
        {
            secondForm.ShowDialog(); // 等待Form2关闭后才继续执行后续代码
            button2.Enabled = true;
            isInGui = false;
        }
    }
}

这种方式不需要额外处理Form2的关闭事件,逻辑清晰,完全适配点击器游戏的商店使用场景。

方法二:订阅Form2的关闭事件(支持非模态交互)

如果你需要主窗口和商店窗口同时交互(比如打开商店时还能继续点击蛋糕),就需要给Form2绑定FormClosed事件,让Form1主动感知商店窗口的关闭:

  1. 修改Form1的button2_Click方法,添加事件订阅:
public void button2_Click(object sender, EventArgs e)
{
    if (!isInGui)
    {
        var secondForm = new WindowsFormsApplications2.Form2();
        // 绑定Form关闭事件,指定触发的处理方法
        secondForm.FormClosed += OnShopFormClosed;
        secondForm.Show();
        button2.Enabled = false;
        isInGui = true;
    }
}
  1. 在Form1里新增事件处理方法:
private void OnShopFormClosed(object sender, FormClosedEventArgs e)
{
    // 重新启用按钮并重置状态
    button2.Enabled = true;
    isInGui = false;
    // 取消订阅事件,避免内存泄漏
    ((Form)sender).FormClosed -= OnShopFormClosed;
}

额外注意点

  • 确保isInGui变量在Form1初始化时被设置为false(比如在Form1的构造函数里添加isInGui = false;),否则初始状态可能异常。
  • 你原来代码里的else if (isInGui == true)分支可以删掉,因为当isInGui为true时button2已经被禁用,用户根本无法点击这个按钮,这个分支永远不会被触发。

内容的提问来源于stack exchange,提问作者zHoop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:23:12