Saad Shaikh
Saad Shaikh

Reputation: 179

Show Main Form after splash screen completes the background process

Is it possible to show just splash screen (without showing main form)?

SplashScreen splash;

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

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

    BackgroundWorker backgroundWorker = new BackgroundWorker();
    backgroundWorker.DoWork += BackgroundWorker_DoWork;
    backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
    backgroundWorker.RunWorkerAsync();

    // var mainForm = MainForm();
    // Application.Run(layoutForm); // I don't want to call this from here
}


private static void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     splash.Close();
     // This never gets called, coz application ended
}

private static void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i <= 100; i++)
    {
        Thread.Sleep(100);
    }
}

Upvotes: 0

Views: 375

Answers (1)

Handbag Crab
Handbag Crab

Reputation: 1538

You would call your Splash screen from your main form.

public partial class mainform : Form
{
    public mainform()
    {
        InitializeComponent();
    }

    public mainform_Load(object sender, EventArgs e)
    {
        this.Visible = false;
        using (SplashScreen ss = new SplashScreen())
        {
            ss.ShowDialog();
            SetTheme(ss.LoadedTheme);
            this.Visible = true;
        }
    }

    private void SetTheme(Theme theme)
    {
        //Put your theme setting code here.
    }
}

Here's how your SplashScreen code will look:

public partial class SplashScreen : Form
{
    public Theme LoadedTheme { get; private set; }

    public SplashScreen()
    {
        InitializeComponent();
    }

    public void SplashScreen_Load(object sender, EventArgs e)
    {
        bwSplashScreenWorker.RunWorkerAsync();
    }

    public void bwSplashScreenWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Load in your data here
        LoadedTheme = LoadTheme();
    }

    public void bwSplashScreenWorker_Completed(object sender, RunWorkerCompletedEventArgs e)
    {
        DialogResult = DialogResult.OK;
    }
}

Now, your application will start, when the mainform is loaded it will hide itself, open the SplashScreen in a blocking manner. The splashscreen will load in your theme data in a background thread and save it into the LoadedTheme property. When the background worker completes it will set the DialogResult to OK which closes the SplashScreen and returns control to mainform_Loaded. At this point you call your SetTheme method passing in the public property LoadedTheme from your SplashScreen. Your SetTheme method sets up your theme and returns back to mainform_Loaded where it sets the mainform to visible.

Upvotes: 1

Related Questions