16

我的项目中有两个表单:Form1 和 Form2。Form1 中有一个按钮,我想要做的是关闭 Form1 并在单击该按钮时显示 Form2。

首先,我试过

Form2 frm = new Form2();
frm.Show();
this.Close();

但随着 Form1 关闭,Form2 也关闭了。接下来,我尝试了

Form2 frm = new Form2();
frm.Show();
this.Hide();

但是有一个缺点是当 Form2 关闭时应用程序不会退出。所以,我不得不在 Form2 的 form_FormClosing 部分放入其他源。

嗯....我想知道这是否是正确的方法....那么,处理这个问题的正确方法是什么?

4

4 回答 4

36

Program.cs 中自动生成的代码是为了在启动窗口关闭时终止应用程序而编写的。您需要对其进行调整,使其仅在没有更多窗口时终止。像这样:

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

    static void FormClosed(object sender, FormClosedEventArgs e) {
        ((Form)sender).FormClosed -= FormClosed;
        if (Application.OpenForms.Count == 0) Application.ExitThread();
        else Application.OpenForms[0].FormClosed += FormClosed;
    }
于 2012-05-26T20:02:41.640 回答
4

默认情况下,第一个窗体控制 Windows 窗体应用程序的生命周期。如果你想要几个独立的窗口窗体,你的应用程序上下文应该是一个独立于窗体的上下文。

public class MyContext : ApplicationContext
{
   private List<Form> forms;     

   private static MyContext context = new MyContext();

   private MyContext()
   {
      forms = new List<Form>();
      ShowForm1();
   }

   public static void ShowForm1()
   {
      Form form1 = new Form1();
      context.AddForm(form1);
      form1.Show();
   }

   private void AddForm(Form f)
   { 
      f.Closed += FormClosed;
      forms.Add(f);
   }

   private void FormClosed(object sender, EventArgs e)
   {
      Form f = sender as Form;
      if (form != null)
          forms.Remove(f);
      if (forms.Count == 0)
         Application.Exit();
   }          
}

要使用上下文,请将其传递给 Application.Run(而不是表单)。如果要创建另一个 Form1,请调用 MyContext.ShowForm1() 等。

public class Program
{
   public void Main()
   {
      Application.Run(new MyContext());
   }
}
于 2012-05-26T19:57:17.133 回答
-1

你可以采取这种方式:

form2 f2=new form2()
this.Hide();
f2.Show();

希望对您有所帮助。

于 2012-05-26T19:45:41.430 回答
-1

将其写入您的方法中,该方法在FormClosing事件发生时执行。

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
      // Display a MsgBox asking the user if he is sure to close
      if(MessageBox.Show("Are you sure you want to close?", "My Application", MessageBoxButtons.YesNo) 
         == DialogResult.Yes)
      {
         // Cancel the Closing event from closing the form.
         e.Cancel = false;
         // e.Cancel = true would close the window
      }
}
于 2014-06-13T07:25:55.260 回答