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

WPF C#预加载主窗体:加载窗体显示7秒后切换的实现方案

没问题!你完全可以实现「后台预加载主窗体+加载窗体显示满7秒再切换」的效果,完美适配你的场景。下面给你具体的实现思路和代码示例:

核心实现思路
  • 先启动并显示加载窗体,让用户看到加载状态
  • 异步在后台初始化主窗体(注意必须在UI线程创建WinForms控件,避免跨线程异常)
  • 加载窗体同时计时,等到满7秒且主窗体加载完成两个条件都满足时,关闭加载窗体并显示主窗体
  • 主窗体初始化完成后暂时隐藏,直到加载窗体关闭再显示
具体代码实现

1. 修改Program.cs启动逻辑

这里我们要调整程序入口,先启动加载窗体,同时异步加载主窗体:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    FormMain mainForm = null;
    // 创建主窗体的加载任务
    var loadMainTask = Task.Run(() =>
    {
        // 切换回UI线程创建并初始化主窗体(WinForms控件必须在UI线程操作)
        SynchronizationContext.Current.Send(_ =>
        {
            mainForm = new FormMain();
            // 执行你的耗时初始化操作,比如加载数据库、初始化控件等
            mainForm.LoadHeavyResources(); // 替换成你实际的初始化方法
            mainForm.Hide(); // 初始化完成后先隐藏
        }, null);
    });

    // 启动加载窗体,并传入主窗体的加载任务用于判断
    var loadingForm = new FormLoading(loadMainTask);
    Application.Run(loadingForm);

    // 加载窗体关闭后,显示主窗体并启动主消息循环
    if (mainForm != null)
    {
        mainForm.Show();
        Application.Run(mainForm);
    }
}

2. 改造你的加载窗体(FormLoading)

修改加载窗体的代码,添加计时逻辑和主窗体加载完成的判断:

public partial class FormLoading : Form
{
    private int _elapsedSeconds = 0;
    private readonly Task _mainFormLoadTask;

    // 构造函数接收主窗体的加载任务
    public FormLoading(Task mainLoadTask)
    {
        InitializeComponent();
        _mainFormLoadTask = mainLoadTask;
    }

    private void FormLoading_Load(object sender, EventArgs e)
    {
        tick.Interval = 1000; // 设置定时器每秒触发一次
        tick.Start();
    }

    private void tick_Tick(object sender, EventArgs e)
    {
        _elapsedSeconds++;
        // 可选:更新进度条显示,比如 progressBar1.Value = (_elapsedSeconds * 100) / 7;

        // 同时满足两个条件:已经显示满7秒,且主窗体加载完成
        if (_elapsedSeconds >= 7 && _mainFormLoadTask.IsCompleted)
        {
            tick.Stop();
            this.Close(); // 关闭加载窗体,自动切换到主窗体
        }
    }
}
关键注意事项
  • UI线程限制:WinForms的所有控件创建和操作必须在UI线程完成,所以我们用SynchronizationContext.Current.Send切换回UI线程初始化主窗体,避免跨线程操作异常。
  • 双重等待逻辑:既保证加载窗体至少显示7秒,又确保主窗体完全加载好再切换,不会出现主窗体还没准备好就显示的情况。
  • 主窗体隐藏:初始化主窗体后调用Hide(),直到加载窗体关闭再显示,用户完全看不到主窗体的加载过程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:37:21