C# 卸载和加载窗体/隐藏和关闭

C# unload and load form / hide and close

我正在使用 Windows 表单应用程序在 C# 中编写一个简单的侧滚程序。我想要它,所以当玩家触摸出口点时,这会立即加载一个新级别。

为了实现这一点,我使用了以下代码:

if (player.Bounds.IntersectsWith(exit.Bounds))
{
    Form2 myNewForm = new Form2();
    myNewForm.Visible = true;
    this.Hide();
}

这行得通。但是,它加载了许多 form2 实例——我只希望它加载一次。我不知道怎么写这个(抱歉,我是新手 - 写这段代码花了我一段时间!)。

此外,通过新表单加载关卡效率低下。有没有办法卸载打开的表单以在同一个 window/instance 中加载下一个表单,而不是创建另一个单独的 window?

抱歉,如果不清楚。我已经做了我最好的研究+我是新来的。请不要提及 XNA!谢谢

您可以使用 Application.OpenForms[] 集合来检索打开的表单实例,然后显示它。

试试这个:

Form2 frmMyForm = (Form2)Application.OpenForms["formName"];
frmMyForm.Show();

实际问题不在于您的表单被多次加载,而在于您的游戏逻辑在到达关卡终点时没有被暂停。这意味着当新关卡已经加载时,您的游戏会继续玩旧关卡。

如果 Form1 是主窗体,那么您的整个应用程序将关闭。您需要引导程序,它将成为您应用程序的入口点,而不是 Form1。如果你这样做,你的 Form1 将是一个 child 与 Form2 相同的意义。您可以在不关闭应用程序的情况下打开和关闭它们。如果您不知道该怎么做,只需创建另一个空窗体,我们称它为 Main 并将其作为您应用程序的起始窗体。然后隐藏它并从主窗体作为模态打开 Form1。然后,当您在 Form1 中完成关卡时,关闭 Form1,代码流将 return 到主窗体,您将从主窗体生成 Form2 作为模态。您将拥有完全可预测的逻辑,所有表单都从一个受控位置打开。

您需要对项目的 Program.cs 文件稍作修改,以更改您的应用决定终止的方式。当没有更多 windows 剩余时,您可以简单地退出。让它看起来像这样:

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var start = new Form1();
        start.FormClosed += WindowClosed;
        start.Show();
        Application.Run();
    }

    static void WindowClosed(object sender, FormClosedEventArgs e) {
        if (Application.OpenForms.Count == 0) Application.Exit();
        else Application.OpenForms[0].FormClosed += WindowClosed;
    }
}

现在很简单:

if (player.Bounds.IntersectsWith(exit.Bounds))
{
    new Form2().Show();
    this.Close();
}