Первая форма не закрывается, вторая не открывается - PullRequest
0 голосов
/ 26 марта 2019

Я бы хотел получить приветственную форму с именем StartForm.Это закрывает, а затем открывает мою MenuForm.

Текущая проблема: первая остается открытой, не закрывается, чтобы показать вторую.

Я пробовал несколько вещей, например, просто показывал и скрывал их,Теперь я пытаюсь запустить Application.run, а затем скрыть его.К сожалению, он остается открытым.И приложение не запускает вторую форму.

    static void Main()
    {
        Form StartForm = new Main();
        MForm MenuForm = new MForm();
        Application.Run(StartForm);
        //
        Task.Delay(500).ContinueWith((t) =>
        {
            StartForm.Hide();
            Application.Run(MenuForm);
        });
        }

Я ожидал, что это закроет первую форму после ожидания задержки, но она остается открытой.

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Вызов Application.Run() вызывает запуск нового цикла сообщений приложения в текущем потоке. Если последующий вызов Application.Run() выполняется во время работы первого приложения, InvalidOperationException генерируется в соответствии с документами . Однако в вашем случае это на самом деле невозможно, так как ваш вызов Application.Run() вызывается в потоке пользовательского интерфейса, который блокирует выполнение любого следующего кода, пока он не завершится.

Вместо этого нам нужно загрузить приложение с помощью Application.Run(new Main()), а затем внутри формы Main мы будем обрабатывать отображение и скрытие.

Вот как я бы предложил это сделать:

Во-первых, в вашем методе Main замените все на Application.Run(new Main());.

Затем внутри вашей Main формы создайте метод, подобный следующему:

private void Main_Shown(Object sender, EventArgs e)
{
    Task.WaitAll(Task.Delay(500));
    this.Hide();
    var menuForm = new MForm();
    menuForm.Closed += (obj, args) => { this.Show(); };
    menuForm.Show();
}

И, наконец, перейдите в файл Main.Designer.cs и убедитесь, что вы подписали событие Shown на метод Main_Shown, который вы только что создали в методе InitializeComponent, следующим образом:

this.Shown += new System.EventHandler(this.Main_Shown);

Объяснение того, что здесь происходит:

Согласно документам событие Form.Shown запускается при первом показе формы пользователю. Это идеально подходит для данного варианта использования, поэтому мы «подключаемся» к нему и реагируем на него, ожидая задержки в 500 миллисекунд.

После этого мы скрываем текущую (Main) форму, создаем новую (MForm) форму и показываем ее. Но более важная деталь заключается в том, что мы подписываемся на это событие формы Closed, чтобы при закрытии пользователем форма Main снова показывала себя.

0 голосов
/ 26 марта 2019

использовать таймер для открытия второй формы в Firstform и Скрыть первую форму после показа Второй формы.

вот так.

Главная

static void Main()
{
    Form StartForm = new Main();
    Application.Run(StartForm);
}

FirstForm

установить таймер с интервалом 5000 и включить его.

private void timer1_Tick(object sender, EventArgs e)
{
    MForm MenuForm = new MForm();
    this.Hide();
    MenuForm.Show();
    timer1.Stop();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...