c# winforms splash-screen

c# - Mostrar pantalla de bienvenida durante la carga del formulario principal



winforms splash-screen (1)

Estoy tratando de hacer que la pantalla de presentación aparezca primero y después de la presentación, aparece MainForm . Pero la barra de progreso que tengo en la pantalla de inicio no llega al final de la barra. Y el programa continúa ejecutándose y no funciona.

¿Cómo puedo mostrar la pantalla de inicio durante la carga del formulario principal?

Mi código es algo así:

public partial class SplashForm : Form { public SplashForm() { InitializeComponent(); } private void SplashForm_Load(object sender, EventArgs e) { timer1.Enabled = true; timer1.Start(); timer1.Interval = 1000; progressBar1.Maximum = 10; timer1.Tick += new EventHandler(timer1_Tick); } public void timer1_Tick(object sender, EventArgs e) { if (progressBar1.Value != 10) { progressBar1.Value++; } else { timer1.Stop(); Application.Exit(); } } }

Aquí está la primera parte del código de MainForm :

public partial class MainForm : Form { public MainForm() { InitializeComponent(); Application.Run(new SplashForm()); } }


Hay diferentes formas de crear pantallas de bienvenida. Es mejor separar la lógica de mostrar y cerrar la pantalla de inicio de la lógica de su formulario principal.

Para hacerlo, puede crear un evento LoadCompleted y luego suscribirse en la clase Program , y mostrar y cerrar su pantalla de inicio allí.

Aquí hay una implementación de lo que describí anteriormente:

1- En su MainForm , agregue un evento LoadCompleted y luego anule el método OnLoad para generar el evento. (El evento probablemente Shown es aplicable en lugar de nuestro evento personalizado).

public event EventHandler LoadCompleted; protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.OnLoadCompleted(EventArgs.Empty); } protected virtual void OnLoadCompleted(EventArgs e) { var handler = LoadCompleted; if (handler != null) handler(this, e); } private void MainForm_Load(object sender, EventArgs e) { //Just for test, you can make a delay to simulate a time-consuming task //In a real application here you load your data and other settings }

2- En la clase Program , muestre SplashForm luego suscríbase al evento LoadCompleted de su MainForm y muestre MainForm , luego en LoadCompleted , cierre SplashForm .

static class Program { static SplashForm mySplashForm; static MainForm myMainForm; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Show Splash Form mySplashForm = new SplashForm(); if (mySplashForm != null) { Thread splashThread = new Thread(new ThreadStart( () => { Application.Run(mySplashForm); })); splashThread.SetApartmentState(ApartmentState.STA); splashThread.Start(); } //Create and Show Main Form myMainForm = new MainForm(); myMainForm.LoadCompleted += MainForm_LoadCompleted; Application.Run(myMainForm); if(!(mySplashForm == null || mySplashForm.Disposing || mySplashForm.IsDisposed)) mySplashForm.Invoke(new Action(() => { mySplashForm.TopMost = true; mySplashForm.Activate(); mySplashForm.TopMost = false; })); } private static void MainForm_LoadCompleted(object sender, EventArgs e) { if (mySplashForm == null || mySplashForm.Disposing || mySplashForm.IsDisposed) return; mySplashForm.Invoke(new Action(() => { mySplashForm.Close(); })); mySplashForm.Dispose(); mySplashForm = null; myMainForm.TopMost = true; myMainForm.Activate(); myMainForm.TopMost = false; } }