c# - 制作启动画面

标签 c# winforms splash-screen

闪屏的概念并没有让我觉得应该如此复杂,但我无法绘制整个闪屏。

假设我有两个 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/

相关文章:

c# - ASP.NET 使用 SqlConnection 连接 MySQL

c# - 过滤某些浏览器的 "Top Sites"功能生成的网站访问

c# - 检测 ctrl+左键单击 winforms 应用程序

c# - 在 winforms 中获取 ISP 提供商名称?

c# - 如何从不同应用程序的窗口控件中读取数据?

android - 启动屏幕应用程序和隐藏操作栏

c# - 在 x y 排序中使用变量

c# - Windows Phone 8.1 Pivot 中的两列 Gridview

java - Eclipse ADT 卡在启动屏幕上,并且可用 RAM 的使用率很高

java - 如何在启动屏幕上显示 jbutton