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;
}
}