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

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

Application.Run(new Form1());

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

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

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


person rumsey    schedule 25.05.2011    source источник
comment
если Form2 вызывается Form1 как модальная форма с ShowDialog, почему вы хотите скрыть вызывающую форму?   -  person Davide Piras    schedule 25.05.2011
comment
Давиде, на самом деле я хотел бы вызвать его немодально с помощью Показать, но окно сразу закрывается.   -  person rumsey    schedule 25.05.2011
comment
Я изменил свой ответ, чтобы показать вам, как изменить цикл сообщений для немодальных форм.   -  person Jodrell    schedule 26.05.2011


Ответы (3)


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

Чтобы попробовать этот пример кода, создайте новое приложение WinForms в Visual Studio (например, Файл --> Новый проект, выберите Visual C# --> Классический рабочий стол Windows и используйте шаблон Приложение 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, вы также можете создать кнопку Button1, которая выполняет эту работу, но в этом случае не забудьте закрыть форму, к которой принадлежит кнопка, через this.Close() явно:

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

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

person Jackson Pope    schedule 25.05.2011
comment
Если я скрою форму, как мне вернуться к ней из формы 2, когда я закончу? Я не могу вызвать Form1.Show() из методов Form2? - person rumsey; 25.05.2011
comment
@rumsey: ShowDialog будет ждать закрытия Form2, поэтому после вызова ShowDialog() вызовите this.Show(). - person Jackson Pope; 26.05.2011
comment
Просто скрыв его, вы сохраните его в памяти, и это нормально, если вы захотите снова открыть его позже. В противном случае лучше закрыть его. - person Matt; 23.11.2012

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

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

person Nathan Goings    schedule 19.03.2014