启动画面的概念并不会让我觉得应该如此复杂,但我无法完成整个启动画面的绘制。制作启动画面
假设我有两个System.Windows.Forms.Form
s:RealForm和SplashScreen。 RealForm包含最初的GUI。在RealForm加载过程中(即在Load
事件的事件处理程序中),RealForm创建到数据库的连接,然后测试连接。这可能需要几秒钟,所以我做的这一切之前,我试着投了闪屏,像这样:
private void RealForm_Load(object sender, EventArgs e)
{
SplashScreen splash = new SplashScreen();
splash.Show();
loadAndCheckDatabase();
splash.Close();
}
的问题是,闪屏仅被部分地拉伸,所以它并没有真正看起来很像一个闪屏。任何想法为什么?我该怎么办?
对于奖励积分,有没有人知道在哪里可以找到所有发生在典型的创建,使用和破坏形式的事件的解释?上面的问题可能是因为我不明白什么顺序的事情发生或挂钩到表单事件。
UPDATE 关闭,但并不完全:寻找多一点的建议。下面是当前的代码:
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
事件的处理程序中。但是,正如你可能猜到的那样,你仍然可以在瞬间看到表格......所以这不是一个很好的解决方案。
有什么办法可以在工作线程上等待,而我仍然在Load处理程序中?
这可能很明显,但请确保在loadAndCheckDatabase调用中没有任何UI代码,甚至没有消息框,否则可能会遇到问题。 – 2010-08-13 16:45:32
我甚至不打扰Application.DoEvents(),只是使用BackgroundWorker。如果您想在UI保持响应时执行一个简单的逻辑单元,请使用BackgroundWorker。如果您希望UI线程去执行在UI的消息队列中等待的所有内容,* even *如果用户设法排队等待鼠标点击,这些点击会执行看起来像线程负载正在运行,但实际上只有一个,然后使用Application.DoEvents()。 – 2010-08-13 18:00:08