我有一个使用许多控件的应用程序,这些控件可能需要很长时间才能初始化(大约 10 到 30 秒)。因此,我为我的应用程序使用了启动画面来加载它们,并向用户呈现某种正在发生的事情的满足感。我显示一个旋转的 gif 和一个进度条。
因为我正在预加载控件,所以似乎唯一的方法是在主 UI 线程上。然后我发现了 Microsoft.VisualBasic.ApplicationServices。现在我像这样做我的spalsh屏幕。
程序.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;
}
}
}
飞溅.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;
}
}
}
主要.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 旋转和进度条在启动屏幕上更新。