启动屏幕Winforms

时间:2016-09-12 05:33:12

标签: c# .net winforms splash-screen

我有一个.Net Winform应用程序,需要一些时间来加载。

我想创建一个启动画面,它会在我点击我的应用程序时启动,并在我的应用程序打开时关闭。基本上通过启动画面我想监视我的应用程序的初始化过程

Splash Screen应该是一个不同的winform,应该在单独的Thread中运行。

我想要一个名为“停止等待”的按钮。在Splash屏幕中,用户可以点击它来取消打开应用程序,我应该可以关闭应用程序。

同样在Splash屏幕中,我需要显示应用程序初始化的进度。

我对Splash Screen的了解非常有限。您能否举几个例子继续我的要求?

实施启动画面后的另一个问题: 我的应用程序初始化发生在不同的项目中,所以我为Splash Screen创建了一个单独的exe并在主屏幕的不同项目中使用它。在主屏幕中添加启动画面(exe)作为参考并使用Splash Screen中的方法是一个好习惯吗?

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

这是很多问题,我将回答"如何制作启动画面"然后你可以进一步尝试取消并显示初始化进度。

您基本上创建了另一个充当Splash表单的表单。

设置属性:

  • StartPosition = FormStartPosition.CenterScreen
  • MaximizeBox = false
  • FormBorderStyle = FormBorderStyle.None
  • 如果需要,可以加载BackgroundImage

然后在Main中显示主窗口之前创建初始屏幕,显示它并传递对主窗口对象的引用

Splash splash = new Splash();
splash.Show();

MainWindow wnd = new MainWindow(splash);

在主窗口的MainWindowLoad_Load函数中:

public MainWindow(Splash splash)
{
  mSplash = splash;
}
private void MainWindow_Load(object sender, System.EventArgs e)
{
  // do long initialisation, and when done....

  mSplash.Close();
  mSplash = null;

}

答案 1 :(得分:0)

因为启动画面与外观有关,我建议您让UI线程处理它,并将您的代码带入另一个执行线程,否则在启动屏幕的显示中需要更改任何内容BeginInvoke。因此
这是我的方式:

private void MainForm_Load(object sender, EventArgs e)
{
    LoadingForm _loading = new LoadingForm();
    BackgroundWorker _worker = new BackgroundWorker { WorkerReportsProgress = true };
    _worker.ProgressChanged += (o, z) =>
    {
        _loading.progressBar1.Minimum = 0;
        _loading.progressBar1.Maximum = 100;
        _loading.progressBar1.Value = (z as ProgressChangedEventArgs).ProgressPercentage;
    };
    _worker.RunWorkerCompleted += (fWorker, fargs) =>
    {
        _loading.Dispose();// this is executed when all the code in dowork event is completed,disposing the loading form and continuing your code
    };
    _worker.DoWork += (workerO, workerArgs) =>
    {
        // execute your code here , update progressbar as you go:
        int yourProgress = 0;//need to generate this in your code as percentage 0-100
        _worker.ReportProgress(yourProgress);


      //////////////////////////just to show progress change//////////////////////////////
        for (int i = 0; i < 5; i++)
        {
            Thread.Sleep(1500);
            yourProgress += 20;
            _worker.ReportProgress(yourProgress);
        }
        Thread.Sleep(3000);
        ////////////////////////////////////////////////////////////////////////////////

    };
    _worker.RunWorkerAsync();



    _loading.ShowDialog(this);


}

请注意,您需要公开ProgressBar Control的修饰符,以便让后台工作人员更改其百分比。