windows 在C#中切换窗体

ih99xse1  于 2023-08-07  发布在  Windows
关注(0)|答案(3)|浏览(138)

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

Application.Run(new Form1());

字符串
并开始Form1。我想切换到另一个窗体并同时关闭Form1。问题是,如果我在Form1中使用this.Close(),然后我用Form.ShowDialog()调用另一个表单,那么程序就结束了。如果我把它放在ShowDialog之后,那么它会一直在后台,直到我关闭Form2,这时程序结束。
如何在关闭当前打开的帧的同时生成Form2的副本?

**编辑:**我也试过用.Show()调用Form2,但新框架立即关闭。

pkwftd7m

pkwftd7m1#

下面的解决方案按您的预期工作。
要尝试此示例代码,请在Visual Studio中创建一个新的WinForms应用程序(即文件-->新建项目,选择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(右上角),Form 1关闭,但显示Form2。再次单击X,表单将关闭(并退出应用程序)。
除了将Form2的启动放置到FormClosed事件中,您还可以创建一个按钮Button 1来完成这项工作,但在这种情况下,不要忘记通过this.Close()显式关闭按钮所属的表单:

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

wecizke3

wecizke32#

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

ukdjmx9f

ukdjmx9f3#

在同一个google上找到了这个问题和一个codeproject
作者基本上创建了一个顶级表单,用于管理要显示的表单之间的切换。

相关问题