在加载主窗体期间显示启动画面

我试图让启动画面首先出现,在启动后, MainForm出现。 但是我在启动画面中的进度条没有到达栏的末尾。 程序继续运行,不起作用。

如何在加载主窗体期间显示启动画面?

我的代码就是这样的:

 public partial class SplashForm : Form { public SplashForm() { InitializeComponent(); } private void SplashForm_Load(object sender, EventArgs e) { timer1.Enabled = true; timer1.Start(); timer1.Interval = 1000; progressBar1.Maximum = 10; timer1.Tick += new EventHandler(timer1_Tick); } public void timer1_Tick(object sender, EventArgs e) { if (progressBar1.Value != 10) { progressBar1.Value++; } else { timer1.Stop(); Application.Exit(); } } } 

以下是MainForm代码的第一部分:

 public partial class MainForm : Form { public MainForm() { InitializeComponent(); Application.Run(new SplashForm()); } } 

创建启动画面有不同的方法。 最好将显示和关闭启动画面的逻辑与主窗体的逻辑分开。

为此,您可以创建一个LoadCompleted事件,然后在Program类中订阅它,并在那里显示并关闭您的启动画面。

这是我上面描述的实现:

1-在MainForm ,添加LoadCompleted事件,然后重写OnLoad方法以引发事件。 (可能Shown事件适用于我们的自定义事件。)

 public event EventHandler LoadCompleted; protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.OnLoadCompleted(EventArgs.Empty); } protected virtual void OnLoadCompleted(EventArgs e) { var handler = LoadCompleted; if (handler != null) handler(this, e); } private void MainForm_Load(object sender, EventArgs e) { //Just for test, you can make a delay to simulate a time-consuming task //In a real application here you load your data and other settings } 

2-在Program类中,显示SplashForm然后订阅MainForm LoadCompleted事件并显示MainForm ,然后在LoadCompleted中关闭SplashForm

 static class Program { static SplashForm mySplashForm; static MainForm myMainForm; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Show Splash Form mySplashForm = new SplashForm(); if (mySplashForm != null) { Thread splashThread = new Thread(new ThreadStart( () => { Application.Run(mySplashForm); })); splashThread.SetApartmentState(ApartmentState.STA); splashThread.Start(); } //Create and Show Main Form myMainForm = new MainForm(); myMainForm.LoadCompleted += MainForm_LoadCompleted; Application.Run(myMainForm); if(!(mySplashForm == null || mySplashForm.Disposing || mySplashForm.IsDisposed)) mySplashForm.Invoke(new Action(() => { mySplashForm.TopMost = true; mySplashForm.Activate(); mySplashForm.TopMost = false; })); } private static void MainForm_LoadCompleted(object sender, EventArgs e) { if (mySplashForm == null || mySplashForm.Disposing || mySplashForm.IsDisposed) return; mySplashForm.Invoke(new Action(() => { mySplashForm.Close(); })); mySplashForm.Dispose(); mySplashForm = null; myMainForm.TopMost = true; myMainForm.Activate(); myMainForm.TopMost = false; } }