Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SplashScreen.Close(Timespan.FromMilliseconds(int)) : Is there an Event dispatched at Timespan Complete?

C# WPF Application

I have a SplashScreen being displayed at startup for a minimum amount of time by using

Thread.Sleep(int); //int = milliseconds to display splash screen

When that sleep time is reached, the code resumes and the SplashScreen fades out to close by using

SplashScreen.Close(Timespan.FromMilliseconds(int)); //int = milliseconds fade-out

I would like to pause at this point to wait until the SplashScreen has become 100% transparent and is fully closed, then continue with other tasks, I.E. Writiting to the Console or displaying a MainWindow.

Is there an event fired when the (TimeSpan.FromMilliseconds(int)) is complete? Any other suggestions?

namespace StartupSplash
{
    public class SplashScreenStartup
    {
        //IMPORTANT:set image property to Resource and NOT Splash Screen
        private SplashScreen Splash = new SplashScreen("Resources/SplashScreen.png");

        public void SplashScreenStartUp()
        {
            Splash.Show(false, true);
            Thread.Sleep(3000); // Pause code, display splash screen 3 seconds
            Splash.Close(TimeSpan.FromMilliseconds(3000)); // 3 second splash fade-out
            // I want to wait until splash screen fadeOut has completed before
            // this next console output is performed.
            Console.WriteLine("Executes before Splash fadeOut completes.");
        }

    }
like image 886
reido113 Avatar asked Nov 03 '12 21:11

reido113


2 Answers

Maybe this code can help you. Using the backgroundworker class:

BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (o, ea) => 
{
   // Dispatcher.Invoke commands the dispatcher to do something
   Dispatcher.Invoke((Action)(() => Splash.Close(TimeSpan.FromMilliseconds(3000)));
   // Sleeps this worker but NOT the UI
   Thread.Sleep(3000);
};
worker.RunWorkerCompleted += (o, ea) =>
{
    // Open your mainwindow sample
    MainWindow w = new MainWindow();
    w.Show();
};

//Runs the worker on its own thread
worker.RunWorkerAsync();

This should start the closing of your splashscreen, then sleep through it, and when it's done it'll open your mainwindow. I actually use something very similar to this to implement a login and fetch info for my WPF app, while displaying a progress bar and updating the text in it to stuff like "Connecting to server", "Logging in" and "Fetching data".

like image 60
AmazingDreams Avatar answered Nov 07 '22 20:11

AmazingDreams


I found that the following code works. I am not quite clear why and I will delve in closer to understand this better.

Please critique as needed, I am here to learn and share. Cheers.

class Tester
    {
    // Create splash screen instance and reference the image location.
    // IMPORTANT Ensure that the image properties are set to Resource and NOT Splash Screen
    private SplashScreen Splash = new SplashScreen("Resources/SplashScreen.png");

    public void Display()
    {
        Splash.Show(false, true);
        // pause the code, thus, displaying the splash for 3 seconds
        Thread.Sleep(3000); 
        // close the splash
        Close();
    }

    private void Close()
    {
        // sets the fadeout time in milliseconds
        int fadeOutTime = 1500; 

        // wait until the splash screen fadeOut has completed before writing to the console
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += (o, ea) =>
        {
            // Run background task (fade out and close the splash)
            Splash.Close(TimeSpan.FromMilliseconds(fadeOutTime));
            // Sleep this worker but NOT the UI (for the same time as the fade out time)
            Thread.Sleep(fadeOutTime);
        };
        worker.RunWorkerCompleted += (o, ea) =>
        {
            // Execute task after splash has closed completely
            Console.WriteLine("This is after the splash screen fadeOut completes.");
        };
        // start the background task, on it's own thread
        worker.RunWorkerAsync(); 
    }

}
like image 33
reido113 Avatar answered Nov 07 '22 19:11

reido113