Переключение между формами в C#

#c# #forms #showdialog

#c# #формы #показать dialog

Вопрос:

Когда запускается автоматически созданный код для моей программы, он вызывает

 Application.Run(new Form1());
  

и запускает Form1. У меня есть другая форма, на которую я хотел бы переключиться и закрыть Form1 одновременно. Проблема в том, что если я использую «это.Закройте ()» в Form1, прежде чем я вызову другую форму с помощью «Form.ShowDialog()», после чего программа завершится. Если я помещаю его после ShowDialog, то он остается в фоновом режиме, пока я не закрою Form2, после чего программа завершается.

Как я могу создать копию Frame2, одновременно закрывая открытый в данный момент фрейм?

редактировать: я пытался вызвать Frame2 с помощью .Show() также, но новый фрейм закрывается мгновенно.

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

1. если Form2 вызывается Form1 как модальная форма с ShowDialog, почему вы хотите скрыть вызывающую форму?

2. Давиде, на самом деле я хотел бы вызвать это без модуляции с помощью Show, но окно немедленно закрывается.

3. Я исправил свой ответ, чтобы показать вам, как изменить цикл сообщений для немодальных форм.

Ответ №1:

Следующее решение работает так, как вы ожидаете.

Чтобы попробовать этот пример кода, создайте новое приложение WinForms в Visual Studio (т.е. Файл -> Новый проект, выберите Visual C # -> Windows Classic Desktop и используйте шаблон «Приложение Windows Forms (.NET Framework)»), затем добавьте вторую форму.

Убедитесь, что две формы названы как Form1 и Form2 , затем измените код в сгенерированном решении следующим образом:

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.FormClosed  = 
           new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        (new Form2()).Show();
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.FormClosed  = 
           new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.Exit();
    }
}
  

И это точка входа в приложение, измените ее следующим образом:

 static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        //Show first form and start the message loop
        (new Form1()).Show();
        Application.Run(); // needed, otherwise app closes immediately
    }

}
  

Хитрость заключается в использовании Application.Run() без параметров и приложения.Exit() в точке, где вы хотите выйти из приложения.

Теперь, когда вы запускаете приложение, Form1 открывается. Нажмите на X (верхний правый угол), и Form1 закроется, но Form2 вместо этого появится. Нажмите на X еще раз, и форма закроется (и также выйдет из приложения).

Вместо того, чтобы помещать запуск Form2 в событие FormClosed, вы также могли бы создать кнопку, Button1 которая выполняет эту работу, но в этом случае не забудьте закрыть форму, к которой относится кнопка, через this.Close() явно:

     private void button1_Click(object sender, EventArgs e)
    {
        (new Form2()).Show(); this.Close();
    }
  

Ответ №2:

Вам нужно вызвать, this.Hide() который делает его невидимым, но все еще открытым, вместо this.Close() того, который его закрывает (и, поскольку это основная форма приложения, приложение тоже закрывается).

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

1. Если я скрою форму, как мне вернуться к ней из Form2, когда я закончу там? Я не могу вызвать Form1.Show () изнутри методов Form2?

2. @rumsey: ShowDialog будет ждать, пока Form2 не будет закрыт, поэтому после вызова ShowDialog() вызовите это. Показать().

3. Простое скрытие сохраняет его в памяти, что нормально, если вы захотите повторно открыть его позже. В противном случае лучше закрыть его.

Ответ №3:

Нашел этот вопрос и codeproject в том же Google.

Автор в основном создает форму верхнего уровня, которая управляет переключением между формами, которые он хочет показать.