主窗口加载时间有点长, 怎么加载一个欢迎窗口,等待主窗口加载一段时间后再进入Application.Run(new WelcomeForm());怎么先显示欢迎窗口,在欢迎窗口里面加载main窗口,等待main窗口加载完成后,隐藏欢迎窗口显示主窗口
C#怎么先显示欢迎窗口,在欢迎窗口里面等待加载main窗口,等main窗口加载完成后,隐藏欢迎窗口显示主窗口
解决方案原理 如果解决方案并不适用于两个窗口都在一个线程上执行的情况。在这种情况下,你可以使用Application.Run()
方法来运行一个ApplicationContext
对象,并在该对象中控制两个窗口的显示和隐藏。
// 创建一个ApplicationContext对象 var context = new MyApplicationContext(); // 在ApplicationContext中运行主窗口 Application.Run(context);
public class MyApplicationContext : ApplicationContext
{
private MainForm mainForm;
private WelcomeForm welcomeForm;
public MyApplicationContext()
{
// 初始化并显示欢迎窗口
welcomeForm = new WelcomeForm();
welcomeForm.FormClosed += WelcomeForm_FormClosed;
welcomeForm.Show();
}
private void WelcomeForm_FormClosed(object sender, FormClosedEventArgs e)
{
// 欢迎窗口关闭后显示主窗口
mainForm = new MainForm();
mainForm.FormLoaded += MainForm_FormLoaded;
mainForm.Show();
}
private void MainForm_FormLoaded(object sender, EventArgs e)
{
// 主窗口加载完成后隐藏欢迎窗口
welcomeForm.Hide();
}
}
public class WelcomeForm : Form
{
public WelcomeForm()
{
// 设置欢迎窗口的属性和布局
// 模拟加载过程
Thread.Sleep(2000);
}
}
public class MainForm : Form
{
public event EventHandler FormLoaded;
public MainForm()
{
this.Load += MainForm_Load;
}
private void MainForm_Load(object sender, EventArgs e)
{
FormLoaded?.Invoke(this, EventArgs.Empty);
}
}
创建了一个MyApplicationContext
类来控制两个窗口的显示和隐藏。首先,欢迎窗口在该类的构造函数中被创建并显示。当欢迎窗口关闭后,WelcomeForm_FormClosed
事件处理程序会创建并显示主窗口。当主窗口加载完成后,MainForm_FormLoaded
事件处理程序会隐藏欢迎窗口。
也可以创建了两个不同的欢迎窗口 在线程中创建对象时,每个线程都会有自己的实例。
为了避免这个问题,我们可以通过在MyApplicationContext
类的构造函数中实例化欢迎窗口,然后将其传递给主窗口来解决。
public class MyApplicationContext : ApplicationContext
{
private MainForm mainForm;
private WelcomeForm welcomeForm;
public MyApplicationContext()
{
// 初始化欢迎窗口实例
welcomeForm = new WelcomeForm();
// 显示欢迎窗口
welcomeForm.Shown += WelcomeForm_Shown;
welcomeForm.Show();
}
private void WelcomeForm_Shown(object sender, EventArgs e)
{
// 显示主窗口
mainForm = new MainForm(welcomeForm);
mainForm.FormLoaded += MainForm_FormLoaded;
mainForm.Show();
}
private void MainForm_FormLoaded(object sender, EventArgs e)
{
// 隐藏欢迎窗口
welcomeForm.Hide();
}
}
public class WelcomeForm : Form
{
public WelcomeForm()
{
// 设置欢迎窗口的属性和布局
// 模拟加载过程
Thread.Sleep(2000);
}
}
public class MainForm : Form
{
public event EventHandler FormLoaded;
public MainForm(Form welcomeForm)
{
welcomeForm.Close();
this.Load += MainForm_Load;
}
private void MainForm_Load(object sender, EventArgs e)
{
FormLoaded?.Invoke(this, EventArgs.Empty);
}
}
}
修改了MyApplicationContext
类的构造函数。现在,它接受一个welcomeForm
参数,并在主窗口中关闭该窗口。这样可以确保只创建一个欢迎窗口实例并将其传递给主窗口。
可以通过一个自定义事件
LoadCompleted
来实现在主窗口加载完成后隐藏欢迎窗口并显示主窗口。 确保Form1
类中确实声明了名为LoadCompleted
的事件,并且在适当的时机触发了该事件。其次,你需要在WelcomeForm_Load
方法中订阅Form1
的LoadCompleted
事件,并正确处理事件,以确保在主窗口加载完成后隐藏欢迎窗口并显示主窗口。public partial class Form1 : Form { public event Action LoadCompleted; public Form1() { InitializeComponent(); } public void LoadForm() { // 模拟主窗口加载完成后触发 LoadCompleted 事件 // 实际应用中应该在主窗口加载完成后调用该方法 LoadCompleted?.Invoke(); } }