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
相关产品推荐
相关产品推荐

