在这个简单的代码中,我希望知道如何使用其实际地址(不是this.Hide()
)调用表单,以便即使表单当前未处于活动状态,我也可以关闭/隐藏它。我的主要目的是隐藏Form2
以在单击按钮时打开Form1
,然后永久关闭Form2
。
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
Form2.Hide(); // This doesn't work
}
}
您不需要引用,因为您已经在表单本身中了。this
,它指向上下文中类的当前实例,将执行以下操作:
this.Hide();
或者,由于它知道上下文:
Hide();
C# 不会为您保留表单引用,这与 Visual Basic 不同。你需要自己保留它们。Form2
只是类型 - 它没有"默认引用"。主要思想不是"每种表单类型一个实例,隐藏并在必要时显示" - 而是"表单是与其他任何对象一样的对象 - 以与任何其他对象相同的方式创建和处置它们"。通常的工作流程不是Form1.Hide(); Form2.Show();
- 它更像是Application.Run(new MainForm()); ... using (var form = new Form1()) { form.ShowDialog(); }
。这并不意味着 VB 方法不能在 C# 中使用 - 它只是意味着您必须自己实现它(或切换到 VB.NET)。如果这是有道理的 - 该设计已经弃用了一段时间,因此请确保您很清楚为什么要这样做,而不仅仅是惯性。
听起来您的真正问题是您正在尝试实现某种向导或通过多种表单的流程。这意味着您应该使用向导,或者更改整个应用程序的生成方式。
看看你的program.cs
.了解它的作用。当传递给Application.Run
的表单关闭时,整个应用程序将关闭。有很多方法可以重写它,但我们不能真正以一般的方式帮助你 - 我只能告诉你,如果你的应用程序不适合"主窗口+其他窗口"模型,默认的应用程序设置将不适合你。
应该有人对你的两个表单的生命周期负责。我们真的无法告诉你是谁 - 也许是Program
类,也许是其中一个窗体,也许是将两个窗体作为模态对话框打开系列的主窗体。我们根本无法分辨 - 这是一个需要您解决的设计问题。但是,负责的人还将在正确的时间点处理关闭和打开各个表单。
this
是Form2
实例内的实际"地址"。因此,将其隐藏在表单本身中是这样做的:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
Hide(); // or this.Hide()
}
}
如果你想在其他地方隐藏它,你需要使用引用来调用它。喜欢:
var f = new Form2();
f.Show();
// Do stuff with form
f.Hide();
如果你在Form2
工作,只需使用this
.
public Form2()
{
InitializeComponent();
this.Hide();
}
您还可以使用:
public Form2()
{
InitializeComponent();
Hide();
}
只有当您以另一种形式工作时,您才不需要调用类似Form2 form = new Form2();
的东西,例如:
public Form1()
{
Form2 form = new Form2();
form.Show(); //or form.Hide();
}