Переключение между формами в C # - PullRequest
10 голосов
/ 25 мая 2011

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

Application.Run(new Form1());

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

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

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

Ответы [ 3 ]

7 голосов
/ 22 ноября 2012

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

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

Убедитесь, что две формы имеют имена 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();
    }
5 голосов
/ 25 мая 2011

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

1 голос
/ 19 марта 2014

Нашел этот вопрос и кодовый проект в том же Google.

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

...