如何在MainWinForm加载完成后关闭无模式的frmStartup窗口
如何在MainWinForm加载完成后关闭无模式的frmStartup窗口
这个问题我之前也碰到过,你当前的写法存在一个关键问题:Application.Run(new MainWinForm())是阻塞调用,它会一直运行直到主窗口被关闭,才会继续执行后面的代码。所以你把frmStartup.Close()放在它后面,完全达不到“主窗口加载完成就关闭启动窗口”的效果。
下面给你两个简单可行的解决方案:
方案一:通过主窗口的Load事件关闭启动窗口
这种方式直接利用WinForm的Load事件(主窗口加载完成后触发),同时通过构造函数把启动窗口的引用传递给主窗口,确保能正确访问并关闭它:
修改Main方法:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Startup frmStartup = new Startup(); frmStartup.Show(); frmStartup.TopMost = true; // 创建主窗口时传入启动窗口的引用 MainWinForm mainForm = new MainWinForm(frmStartup); Application.Run(mainForm); }
修改MainWinForm类:
public class MainWinForm : Form { private readonly Startup _startupForm; // 通过构造函数接收启动窗口引用 public MainWinForm(Startup startupForm) { _startupForm = startupForm; // 订阅Load事件 this.Load += MainWinForm_Load; } private void MainWinForm_Load(object sender, EventArgs e) { // 主窗口加载完成后,关闭启动窗口(先判断是否已释放) if (_startupForm != null && !_startupForm.IsDisposed) { _startupForm.Close(); } } }
方案二:使用匿名方法订阅Load事件(更简洁)
如果你不想修改主窗口的构造函数,也可以在Main方法里直接用匿名方法绑定主窗口的Load事件,这样更简洁:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Startup frmStartup = new Startup(); frmStartup.Show(); frmStartup.TopMost = true; MainWinForm mainForm = new MainWinForm(); // 直接绑定Load事件,触发时关闭启动窗口 mainForm.Load += (sender, e) => { if (!frmStartup.IsDisposed) { frmStartup.Close(); } }; Application.Run(mainForm); }
额外提醒:
不要用Thread.Sleep()这种固定延迟的方式来模拟启动窗口的显示,因为不同机器的加载速度不一样,延迟时间很难设置得恰到好处——有的机器主窗口加载快,用户会看到启动窗口提前关闭;有的机器加载慢,延迟到了主窗口还没好,体验都不好。上面的两种方案都是主窗口真正加载完成后才关闭启动窗口,是更可靠的做法。
备注:内容来源于stack exchange,提问作者John Wang
相关产品推荐
相关产品推荐

