Vitokhv Asked:2020-05-30 14:06:01 +0000 UTC2020-05-30 14:06:01 +0000 UTC 2020-05-30 14:06:01 +0000 UTC 如何在后台加载第二个表单? 772 打开应用程序时,如何Form2在后台加载表单,前提是首先加载它FormMain(主表单,当应用程序打开时)? 当你点击它的时候会在里面pictureBox打开,但是打开它需要大约两秒钟的时间,因为。对于许多资源。Form2panelMainForm2 c# 3 个回答 Voted Best Answer Vadim Ovchinnikov 2020-06-03T22:05:58Z2020-06-03T22:05:58Z 我问了一个类似的问题并找到了答案。因此,我推荐扩展方法 public static class FormHelper { public static void ShowInvisible(this Form form) { // сохраняем параметры окна bool needToShowInTaskbar = form.ShowInTaskbar; FormWindowState initialWindowState = form.WindowState; // делаем окно невидимым form.ShowInTaskbar = false; form.WindowState = FormWindowState.Minimized; // показываем и скрываем окно form.Show(); form.Hide(); // восстанавливаем параметры окна form.ShowInTaskbar = needToShowInTaskbar; form.WindowState = initialWindowState; } } 然后在构造函数中MainForm单击时pictureBox: public class MainForm { private readonly Form2 _form2 = new Form2(); public MainForm() { InitializeComponent(); _form2.ShowInvisible(); } private void PictureBox_Click(object sender, EventArgs e) { _form2.Show(); } } user177221 2020-06-08T01:34:52Z2020-06-08T01:34:52Z 如果 Form2 上的“资源”与渲染无关,请将加载从构造函数 / 移动InitializeComponent到单独的线程(至少将它们转移到 async Form2_Load)。 如果资源确实与渲染相关联,则您无法控制加载,并且它们的初始化必须在 UI 线程中完成 - 为第二个表单运行另一个消息泵。 // вызов конструктора на потоке из пула, на случай если в конструкторе попадется что-то медленное ThreadPool.QueueUserWorkItem((o) => Application.Run(new Form2()) ); 该表单将获得自己的 UI 线程,因此您必须Form1前后处理它Invoke。 Anton Burdin 2020-05-30T15:39:10Z2020-05-30T15:39:10Z 你可以这样试试 public partial class Form1 : Form { private Task<Form2> _formCreator; private Form _form2; public Form1() { InitializeComponent(); _formCreator = Task.Run(() => new Form2()); } private void button1_Click(object sender, EventArgs e) { _form2 = _formCreator.Result; _form2.FormClosing += (o, args) => { args.Cancel = true; (o as Form)?.Hide(); }; _form2.Show(); } } 这样当你再次打开的时候,你只需要在关闭的时候把窗口隐藏起来就可以了。如果还不晚的话。
我问了一个类似的问题并找到了答案。因此,我推荐扩展方法
然后在构造函数中
MainForm单击时pictureBox:如果 Form2 上的“资源”与渲染无关,请将加载从构造函数 / 移动
InitializeComponent到单独的线程(至少将它们转移到 asyncForm2_Load)。如果资源确实与渲染相关联,则您无法控制加载,并且它们的初始化必须在 UI 线程中完成 - 为第二个表单运行另一个消息泵。
该表单将获得自己的 UI 线程,因此您必须
Form1前后处理它Invoke。你可以这样试试
这样当你再次打开的时候,你只需要在关闭的时候把窗口隐藏起来就可以了。如果还不晚的话。