Концепция заставки не кажется мне чем-то настолько сложным, но у меня возникают проблемы с окрашиванием всего заставки.
Допустим, у меня есть два System.Windows.Forms.Form
с: RealForm и SplashScreen. RealForm содержит начальный графический интерфейс. В процессе загрузки 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
формы. Однако, как вы, вероятно, догадываетесь, вы все равно сможете увидеть форму за доли секунды ... так что это не очень хорошее решение.
Есть ли способ подождать в рабочем потоке, пока я все еще в обработчике загрузки?