闪屏的概念并没有让我觉得应该如此复杂,但我无法绘制整个闪屏。
假设我有两个 System.Windows.Forms.Form
:RealForm 和 SplashScreen。 RealForm 包含初始 GUI。在 RealForm 的加载过程中(即,在 Load
事件的事件处理程序中),RealForm 创建到数据库的连接,然后测试连接。这可能需要几秒钟,所以在我做所有这些之前,我尝试像这样抛出启动画面:
private void RealForm_Load(object sender, EventArgs e)
{
SplashScreen splash = new SplashScreen();
splash.Show();
loadAndCheckDatabase();
splash.Close();
}
问题是启动画面只被部分绘制,所以它看起来不太像启动画面。知道为什么吗?我该怎么办?
对于奖励积分,有谁知道在哪里可以找到对典型创建、使用和销毁表单中发生的所有系列事件的解释?上面的问题可能是因为我不明白事情发生的顺序或在哪里 Hook 表单事件。
更新 接近,但不完全是:寻找更多建议。这是当前代码:
private SplashScreen splash = new SplashScreen();
private void RealForm_Load(object sender, EventArgs e)
{
splash.Show();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler
(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
this.Visible = false;
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
splash.Close();
this.Visible = true;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
loadAndCheckDatabase();
}
不幸的是,this.Visible = false
没有做任何事情,因为它在我无法控制的代码中自动设置为 true
。因此,为了解决这个问题,我将 this.Visible = false
放入表单的 Shown
事件的处理程序中。但是,正如您可能猜到的那样,您仍然可以在一瞬间看到表单……所以这并不是一个很好的解决方案。
有没有办法在我仍在加载处理程序中时等待工作线程?
最佳答案
您在同一个线程上显示初始屏幕并检查您的数据库。线程一次只能做一件事。
解决此问题的一种快速且廉价的方法是让 loadAndCheckDatabase()
定期调用 Application.DoEvents()
。然而,这是一个廉价的解决方案。
你真的想在它自己的线程上运行 loadAndCheckDatabase(),一个 BackgroundWorker
是一个很好的简单方法来做到这一点。
关于c# - 制作启动画面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3478753/