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

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

Application.Run(new Form1());

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

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

edit: Я попытался вызвать Frame2 с .Show(), но новый фрейм закрывается мгновенно.

Ответ 1

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

Чтобы попробовать этот пример кода, создайте новое приложение WinForms в Visual Studio (например, File → New Project, выберите Visual С# → 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() без параметров и Application.Exit() в том месте, где вы хотите выйти из приложения.

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

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

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

Ответ 2

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

Ответ 3

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

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