是否有更好的方式来展示另一种形式?

时间:2015-03-16 09:52:23

标签: c# .net winforms

每当我需要显示另一个表单时,我总是实例化一个新的表单对象显示另一个表单(然后隐藏当前表单)。

/*Code in Form1*/

private void button1_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    frm2.Show();

    this.Hide();
}

在我实例化并显示第二个表单之后,我想处理以前的表单(以释放一些内存使用量)但 >主要上下文表单。

  

但是,Dispose()方法正在处理其他WinForms   不是主要的背景形式。

/*Code in Form2*/

private void button1_Click(object sender, EventArgs e)
{
    Form1 frm1 = new Form1();
    frm1.Show();

    this.Dispose();
}

是否可以实例化一个表单对象一次,然后最终在需要时调用/显示

3 个答案:

答案 0 :(得分:1)

您可以开始自己的ApplicationContext,并将其传递给您想要制作MainForm的每个表单。在我看来,你不应该将形式保存在记忆中并随意打开和关闭它们。这可能会导致潜在的内存泄漏。

ApplicationContext ac = new ApplicationContext();
ac.MainForm = new Form1(ac);
Application.Run(ac);

(你会把它放在Application.Run(new Form1());

的位置

Form1中,当您想要Form2主格式时:

ac.MainForm = new Form2(ac);
this.Close();

这样,可以处理表单(因为您调用Close()并使用Show它将自动处理)并且可以清除内存。 Form2的实例将成为新的主要形式。

答案 1 :(得分:1)

/*Code in Form1*/
Form2 frm2;   // --> Inside the class
private void button1_Click(object sender, EventArgs e)
{
    if (frm2 == null)frm2 = new Form2();
    frm2.Show();
    this.Hide();
}

/*Code in Form2*/
Form1 frm1;

//Constructor
public Form2(Form1 frm)
{
     frm1= frm;
     InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    frm1.Show();
    this.Hide();
}

答案 2 :(得分:0)

我会创建一个名为" FormHandler"

的类

这可能有像

这样的方法

这里有一些原型代码(未经测试)

public static class FormHandler
{
   private static readonly Dictionary<string,Form> Instances = new Dictionary<string,Form>();

   public TForm CreateFrom<TForm>()
   {
      string typeName = typeof(TForm).FullName;

     if(Instances.ContainsKey(typeName))
     {
          return Instances[typeName]
     }
     else
     {
       // Create Instace with Activator.CreateInstance,
       // and bind the dispose event to remove the form from the collection 
       // on dispose . Also make sure that you unbind the dispose Event
       [...]
      }
}

现在buttonClick只会调用

FormHandler.CreateForm<Form2>().Show();

将代码分隔到新类,您可以避免复制和粘贴所有按钮