Как создать загрузочный экран перед показом формы?

132
17 мая 2021, 01:50

У меня есть форма ( ScreenSplash.cs ) которая показывает при запуске текст и проверяет некое bool значение.

Есть вторая форма (winforms.cs) которую нужно показать если ScreenSplash дал результат bool == true

Так же имеется вот такой вот класс может его можно как-то реализовать в моём вопросе?

using System;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            using (var splash = new Splash<Form2>())
            {
                Thread.Sleep(5000);
            }
        }
    }
    class Splash<T> : IDisposable where T : Form, new()
    {
        private Form mForm;
        private Thread mThread;
        public Splash()
        {
            this.mForm = new T();
            this.mThread = new Thread(new ThreadStart(this.Func));
            this.mThread.SetApartmentState(ApartmentState.STA);
            this.mThread.Start();
        }
        private void Func()
        {
            Application.Run(this.mForm);
        }
        private delegate void CloseDelegate();
        public void Dispose()
        {
            if (this.mForm.InvokeRequired)
            {
                CloseDelegate d = this.mForm.Close;
                this.mForm.Invoke(d);
            }
            else
            {
                this.mForm.Close();
            }
            this.mForm.Dispose();
        }
    }
}

Реализовал пока что таким способом:

public partial class SplashFrm : Form
{
    Timer timer1 = new Timer();
    public SplashFrm() => this.InitializeComponent();
    private void SplashFrm_Load(object sender, EventArgs e)
    {
        this.timer1.Interval = 3000;
        this.timer1.Tick += new EventHandler(this.Inizialize);
        this.timer1.Start();
    }
    private void Inizialize(object sender, EventArgs e)
    {
        bool testing = false;
        if (testing == true)
        {
            this.timer1.Stop();
            if (!this.timer1.Enabled)
            {
                var frm = new WinForm();
                frm.Show();
                this.Hide();
            }
        }
        else
        {
            this.timer1.Stop();
            MessageBox.Show("Форма не равна true");
            Application.Exit();
        }
    }
}
Answer 1

Покажу на примере точки входа Main(), файл Program.cs. В качестве дополнения посмотрите туториалы по созданию загрузочного экрана. Например, такое или такое.

static class Program
{
    static Thread threadShowSplashScreen;
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        // Создайте поток (будет показывать форму загрузки)
        Thread threadShowSplashScreen = new Thread(ShowSplashScreen)
        {
            Name = "SplashScreen",
            Priority = ThreadPriority.Lowest,
            IsBackground = true
        };
        // Запустите поток
        threadShowSplashScreen.Start();
        // Делайте что-то (форма загрузки уже отображается)
        MainForm mainForm = new MainForm();
        MainPresenter presenter = new MainPresenter(mainForm);
        // Закройте поток (закрыть форму загрузки)
        threadShowSplashScreen.Abort();
        // Запустите основную форму
        // или что вам нужно по условию
        Application.Run(mainForm);
    }
    static void ShowSplashScreen()
    {
        using(SplashScreen ss = new SplashScreen())
        {
            ss.ShowDialog();
        }
    }
}
READ ALSO
Можно ли использовать только primary key в MySQL таблице?

Можно ли использовать только primary key в MySQL таблице?

Дана MySQL БД для хранения анкет и результатов их заполнения

233
Получить данные из формы в файл php

Получить данные из формы в файл php

Мне надо вывести данные из формы в файл

94
Функциональное тестирование в PHP

Функциональное тестирование в PHP

Можно ли использовать модули Symfony для функционального тестирования вне фреймворка, если да, то где можно почитать, как всё это настроитьИли...

93