Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Как загрузить вторую форму в фоновом режиме?

#c_sharp #net #winforms


Как при открытии приложения, загрузить форму Form2 в фоновом режиме, при условии,
что сначала загружается FormMain (основная форма, при открытии приложения)?

При нажатии на pictureBox открывается Form2 внутри panelMain, но на ее открытие тратится
около двух секунд, т.к. на Form2 много ресурсов.


    


Ответы

Ответ 1



Я задавался похожим вопросом и нашёл ответ. Поэтому рекомендую метод расширения 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(); } }

Ответ 2



Если "ресурсы" на Form2 не привязаны к отрисовке - вынесите из загрузку из конструктора / InitializeComponent в отдельный поток (хотя бы перебросьте их в async Form2_Load). Если ресурсы действительно привязаны к отрисовке, из загрузку вы никак не контролируете, и их инициализацию обязательно выполнять в UI Thread - запускайте еще одни message pump для второй формы. // вызов конструктора на потоке из пула, на случай если в конструкторе попадется что-то медленное ThreadPool.QueueUserWorkItem((o) => Application.Run(new Form2()) ); Форма получит свой собственный UI Thread, так что работать с ней из Form1 и обратно придется через Invoke.

Ответ 3



Можно попробовать вот так public partial class Form1 : Form { private Task _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(); } } Чтобы при дальнейшем открытии не создавалось заново, надо при закрытии просто скрывать окно Если еще не поздно.

Комментариев нет:

Отправить комментарий