主窗口加载时间有点长, 怎么加载一个欢迎窗口,等待主窗口加载一段时间后再进入

文章介绍了如何在C#中使用ApplicationContext和事件处理来实现先显示欢迎窗口,等待主窗口加载完成后再显示主窗口的场景,包括使用线程和事件控制窗口的显示与隐藏。
摘要由CSDN通过智能技术生成

主窗口加载时间有点长, 怎么加载一个欢迎窗口,等待主窗口加载一段时间后再进入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 方法中订阅 Form1LoadCompleted 事件,并正确处理事件,以确保在主窗口加载完成后隐藏欢迎窗口并显示主窗口。

public partial class Form1 : Form
{
    public event Action LoadCompleted;

    public Form1()
    {
        InitializeComponent();
    }

    public void LoadForm()
    {
        // 模拟主窗口加载完成后触发 LoadCompleted 事件
        // 实际应用中应该在主窗口加载完成后调用该方法
        LoadCompleted?.Invoke();
    }
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星尘库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值