每当我需要显示另一个表单时,我总是实例化一个新的表单对象显示另一个表单(然后隐藏当前表单)。
/*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();
}
是否可以实例化一个表单对象一次,然后最终在需要时调用/显示?
答案 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();
将代码分隔到新类,您可以避免复制和粘贴所有按钮