C# 删除第一个表单并开始新表单

C# 删除第一个表单并开始新表单,c#,winforms,C#,Winforms,好的,我已经看到了一些类似的问题,但我不确定如何确切地解决这个问题。基本上,我正在用C#创建一个游戏,第一个表单询问用户是否希望开始一个新游戏或恢复以前的游戏。例如,当用户点击“新游戏”时,我想结束此表单并开始一个新表单,其中此表单将是实际游戏。当然,这些是不同的平台和语言,我可以在安卓系统中轻松做到这一点,方法是停止第一个活动,转到另一个活动。在C#中,如果我试图杀死第一个表单,整个程序将终止,因为进程已结束 我认为必须有一个更好的解决方案来解决这个问题,而不是保持第一个表单处于活动状态并隐藏

好的,我已经看到了一些类似的问题,但我不确定如何确切地解决这个问题。基本上,我正在用C#创建一个游戏,第一个表单询问用户是否希望开始一个新游戏或恢复以前的游戏。例如,当用户点击“新游戏”时,我想结束此表单并开始一个新表单,其中此表单将是实际游戏。当然,这些是不同的平台和语言,我可以在安卓系统中轻松做到这一点,方法是停止第一个活动,转到另一个活动。在C#中,如果我试图杀死第一个表单,整个程序将终止,因为进程已结束

我认为必须有一个更好的解决方案来解决这个问题,而不是保持第一个表单处于活动状态并隐藏它?对我来说,至少把它藏起来是浪费。任何想法都将不胜感激!!!提前感谢您的时间

有两种方法

1) 你可以隐藏表格

Form f1=new Form();
f1.Hide();
2) 使其可见为假

Form f1=new Form();
f1.Visible=False;

这里有另一种方法。在程序类中,创建一个公共静态属性,该属性将继续重新创建主窗体

static class Program
{
    public static bool KeepRepeating = false;

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        do 
        {
            Application.Run(new Form1());
        } while (KeepRepeating);
    }
}
为了谨慎起见,您可以在实例化表单后立即将repeating属性设置为false,这样,如果表单由于异常而异常终止,您就不会陷入无休止的循环中:

    public Form1()
    {
        Program.KeepRepeating = false;
        InitializeComponent();
    }

为什么不“杀死”一个容器(即面板),将你的菜单放在你的第一个表单中,然后在另一个容器中放置你的游戏呢

是的,隐藏它会被认为是“浪费”。但这是移动设备和台式机之间的主要区别之一:在台式机上,您很少需要以这种方式担心资源问题。您确实有三种选择:

  • 使用某种方法隐藏表单(例如,
    Hide()
    Visible=false
  • 您总是可以在主窗体上重画内容,而不是隐藏它。创建用户控件或使用面板可能是最简单的方法
  • 如果要删除的表单实际上是主应用程序表单的子表单,请使用
    这种方法怎么样。让你的“游戏”形成一个主要的形式,这是立即提出。然后在该窗体的加载事件中,隐藏窗体并打开窗体,询问您是想要新游戏还是旧游戏

    在他们回答问题后,您关闭辅助窗体,并使用布尔答案来决定将哪些信息加载到窗体中。然后显示游戏形式

        private void GameForm_Load(object sender, EventArgs e)
        {
            this.Hide();
            using (frmAsk frm = new frmAsk())
            {
                frm.ShowDialog();
                LoadGameInfo(frm.LoadNewGame);
            }
            this.Show();
        }
    

    将关闭模式更改为在最后一个窗体而不是主窗体关闭时关闭

    static class Program
    {
        public static bool KeepRepeating = false;
    
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            do 
            {
                Application.Run(new Form1());
            } while (KeepRepeating);
        }
    }
    

    此外,如果您只是在学习.NET/WinForms,我建议您改为学习WPF,尤其是在游戏中。WPF允许您将关机模式设置为“显式”,即当您这样说时

    编辑:我刚刚重读了那个链接,它说它只适用于VB项目


    在后台运行主窗体的方法没有任何问题。

    我很确定它不会在隐藏或不可见时破坏实例……DresJordan是正确的。具体来说:
    Close
    将销毁表单(意味着它将
    Dispose
    the
    form
    ),
    Hide
    将不会这是真的,PC上的资源通常不需要担心。只要我能帮忙,我总是尽量不浪费任何东西!