【问题标题】:transition to a form to another [duplicate]过渡到另一种形式[重复]
【发布时间】:2015-10-10 17:20:48
【问题描述】:

好吧,我用 c# 做了一个多表单应用程序。这意味着我有更多的表格,包括一个主菜单。除其他外,所有表单都有一个返回主菜单的按钮。(除了具有访问特定表单的按钮的主菜单表单) 嗯,这就是我进行这种转变的方式。

this.Close();
Form1 Myform1 = new Form1()
Myform1.Show();

问题是,当我随机关闭应用程序时,它会按照我的意愿消失,但它并没有完全关闭。我的意思是它只是消失了,但它仍然运行。 为什么?以及如何完全关闭?

【问题讨论】:

    标签: c# forms


    【解决方案1】:

    您遇到的基本问题是,默认情况下,当主窗体(最先显示的窗体)关闭时,您的 Winforms 程序将退出。这是因为对该表单的引用被传递给程序的Main() 方法中的Application.Run(Form) 方法。

    有多种方法可以处理该问题,但恕我直言,最直接的方法是不要关闭表单。相反,请在主窗体上调用 Hide() 方法。这将导致它根本不显示,但不关闭。当您想返回它时,只需在该表单实例上调用Show(),它就会再次可见。

    当然,要实现这一点,您需要将该引用传递给可能想要使用它的任何其他代码。因此,您可能会得到如下代码:

    this.Hide(); // Not Close()!
    Form1 Myform1 = new Form1(this)
    Myform1.Show();
    

    然后在Form1 类中的某个地方,您准备关闭它并再次显示主窗体,您将调用Show() 方法。这可能看起来像这样:

    partial class Form1 : Form
    {
        private readonly MainForm _mainForm;
    
        public Form1(MainForm mainForm)
        {
            _mainForm = mainForm;
        }
    
        protected override void OnFormClosed(FormClosedEventArgs e)
        {
            _mainForm.Show();
        }
    }
    

    解决这个问题的另一种方法是首先不将MainForm 传递给Application.Run() 方法。相反,调用Application.Run() 的无参数重载。但是,您将需要一些其他机制来关闭程序。例如,在适当的时候调用Application.Exit()


    虽然这在我看来是一个相当普遍的问题,但我无法找到另一个似乎完全重复的问题。但是,肯定还有大量其他相关问题,包括以下:

    C# Application.Run without Form
    Close a windows form without exiting the entire application
    How can I close a login form and show the main form without my application closing?
    If I close one of my forms, they all close
    Methods this.hide() vs this.close()

    最后两个特别相关,但不幸的是,每个中的最佳答案可能是解决问题的最差方法(即将每个表单放入自己的线程......应该使用多个 UI 线程作为仅作为最后的手段,并且绝对在这里不需要这样做)。因此,请对您在上述任何问题中阅读的任何建议持保留态度。答案中有一些很好的信息,但也有相当多的坏建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多