制作闪屏

JnB*_*ymn 4 c# splash-screen winforms

启动画面的概念并没有让我觉得应该是如此复杂,但是我在绘制整个启动画面时遇到了麻烦.

假设我有两个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();
}
Run Code Online (Sandbox Code Playgroud)

问题是启动画面只能被部分绘制,因此它看起来并不像闪屏.知道为什么吗?我该怎么办?

对于奖励积分,有没有人知道在哪里可以找到典型创建,使用和销毁表单中发生的所有系列事件的解释?上面的问题可能是因为我不明白发生了什么顺序或者在哪里挂钩表单事件.


更新 关闭,但不完全:寻求更多建议.这是当前的代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,this.Visible = false它没有做任何事情,因为它自动设置为true我无法控制的代码.所以,为了解决这个问题,我将其this.Visible = false放入了表单Shown事件的处理程序中.但是,正如你可能猜到的那样,你仍然可以看到表格一瞬间......所以这不是一个很好的解决方案.

当我还在Load处理程序中时,有没有办法等待工作线程?

Mat*_*eer 9

您正在显示启动屏幕并在同一个线程上检查数据库.线程一次只能做一件事.

解决此问题的快速而便宜的方法是定期loadAndCheckDatabase()拨打电话Application.DoEvents().然而,这是一个廉价的修复.

你真的想在自己的线程上运行loadAndCheckDatabase(),这BackgroundWorker是一个很好的简单方法.

  • 这可能是显而易见的,但请确保您的loadAndCheckDatabase调用中没有任何UI代码,甚至不是消息框,否则您可能会遇到麻烦. (2认同)
  • 我甚至不打扰Application.DoEvents(),只使用BackgroundWorker.如果要在UI保持响应的同时执行简单的逻辑单元,请使用BackgroundWorker.如果你想要UI线程去执行在UI的消息队列上等待的所有内容,*甚至*如果用户设法排队鼠标点击,那么执行随机的其他逻辑位会以一种看起来像你当前操作的方式干扰你当前的操作线程负载正在运行,但实际上只有一个,然后使用Application.DoEvents(). (2认同)