12

当我的程序的自动生成代码启动时,它调用

Application.Run(new Form1());

并启动 Form1。我有另一个表单,我想同时切换到并关闭 Form1。问题是,如果我在使用“Form.ShowDialog()”调用另一个表单之前在 Form1 中使用“this.Close()”,那么程序就会结束。如果我把它放在 ShowDialog 之后,它就会一直在后台运行,直到我关闭 Form2,此时程序结束。

如何在关闭当前打开的框架的同时生成 Frame2 的副本?

编辑:我也尝试使用 .Show() 调用 Frame2,但新框架会立即关闭。

4

3 回答 3

8

以下解决方案按您的预期工作。

要试用此示例代码,请在 Visual Studio 中创建一个新的 WinForms 应用程序(即 File --> New Project,选择 Visual C# --> Windows Classic Desktop 并使用模板“Windows Forms App (.NET Framework)”),然后添加第二种形式。

确保这两个表单命名为Form1Form2,然后在生成的解决方案中修改代码如下:

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();
    }
于 2012-11-22T16:16:30.537 回答
6

您需要调用this.Hide()which 使其不可见但仍然打开,而不是this.Close()关闭它(并且看到它是应用程序的主要形式,也关闭应用程序)。

于 2011-05-25T08:55:33.747 回答
1

在同一个谷歌上找到了这个问题和一个代码项目。

作者基本上创建了一个顶级表单来管理他想要显示的表单之间的切换。

于 2014-03-19T02:56:25.523 回答