我有一个使用许多控件的应用程序可能需要很长时间才能进行初始化(大约10到30秒)。因此,我使用启动画面为我的应用程序加载它们,并向用户呈现某些事情正在发生的满足感。我显示一个旋转的gif和一个进度条。
因为我正在预加载控件,所以这似乎是唯一的方法是在主UI线程上。然后我发现了Microsoft.VisualBasic.ApplicationServices。现在我像这样做我的spalsh屏幕。
的Program.cs:
using System;
using System.Reflection;
using System.Windows.Forms;
using Spectrum.Foxhunt.Forms;
using Spectrum.UI;
using Microsoft.VisualBasic.ApplicationServices;
namespace Spectrum.Foxhunt
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
new SplashLoader().Run(args);
}
}
class SplashLoader : WindowsFormsApplicationBase
{
private Main main;
private Splash splash;
public SplashLoader()
{
main = new Main();
splash = new Splash();
}
protected override void OnCreateSplashScreen()
{
this.SplashScreen = splash;
}
protected override void OnCreateMainForm()
{
main.SplashScreenWork(splash);
this.MainForm = main;
}
}
}
Splash.cs:
只是一个带有图形的表单,代表我的应用程序,版本信息,旋转gif和进度条。
namespace Spectrum.Foxhunt.Forms
{
public partial class Splash : Form
{
public int Progress { set { progress.Value = value; } }
public Splash()
{
InitializeComponent();
version.Text = "Version " + typeof(Main).Assembly.GetName().Version;
}
}
}
Main.cs:
有一个空的构造函数和我的方法,它可以在显示初始屏幕时完成所有工作。
public Main()
{
InitializeComponent();
}
public void SplashScreenWork(Splash splash)
{
// Create time-consuming control
splash.Progress = 25;
// Create time-consuming control
splash.Progress = 50;
// Create time-consuming control
splash.Progress = 75;
// Create time-consuming control
splash.Progress = 100;
}
我喜欢这种方法,因为它似乎消除了我在尝试在后台工作程序中完成此工作时遇到的线程问题。而且,尽管背景中正在进行所有工作,我的飞溅形式的旋转gif仍在继续旋转。
话虽如此,我想知道是否有更好的方法来实现加载控件的启动画面,同时仍允许旋转gif旋转,并在闪屏上更新进度条。