2

我查看了所有建议的答案,但似乎没有什么适合我正在寻找的。我想从我的主窗体中调用第二个窗体,在第二个窗体处于活动状态时隐藏我的主窗体,然后在第二个窗体关闭时取消隐藏主窗体。基本上我想在两种形式之间“切换”。

到目前为止,我有:

在我的主要形式中:

private void countClick(object sender, EventArgs e)
{
    this.Hide(); 
    subForm myNewForm = new subForm();
    myNewForm.ShowDialog();
}

在我的第二种形式中,我有:

private void totalClick(object sender, EventArgs e)
{
    this.Close();
}

如何让主窗体显示?

4

5 回答 5

2

ShowDialog将您的辅助表单打开为模态对话框,这意味着 MainForm 的代码执行将在该点停止,您的辅助表单将获得焦点。所以你需要做的就是this.Show在你的 ShowDialog 调用之后放一个。

从上面的链接:

您可以使用此方法在应用程序中显示模式对话框。调用此方法时,它后面的代码要等到对话框关闭后才会执行。

private void countClick(object sender, EventArgs e)
{
    this.Hide(); 
    subForm myNewForm = new subForm();
    myNewForm.ShowDialog();
    this.Show();
}
于 2013-06-25T00:53:52.530 回答
1

假设Form1您单击一个按钮以显示Form2

 Form2 frm2 = new Form2();
 frm2.Activated += new EventHandler(frm2_Activated); // Handler when the form is activated
 frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed); // Hander when the form is closed
 frm2.Show();

现在,这个Form2是显示时还是Activated隐藏调用表单时,在这种情况下Form1

    private void frm2_Activated(object sender, EventArgs e)
    {
        this.Hide(); // Hides Form1 but it is till in Memory
    }

那什么时候Form2会。ClosedUnhide Form1

   private void frm2_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Show(); // Unhide Form1
    }
于 2013-06-25T01:07:38.923 回答
1

这很难正确地做到。问题是您必须避免根本没有可以获得焦点的窗口。Windows 窗口管理器将被迫寻找另一个窗口来获得焦点。那将是另一个应用程序的窗口。您的窗口将消失在它后面。

在您现有的代码片段中已经是这种情况,您在显示对话框之前隐藏了主窗口。这通常结果很好,除非对话框创建速度很慢。对话框关闭时肯定会发生。

因此,您需要做的是在显示对话框隐藏窗口并在对话框关闭之前再次显示它。这需要技巧。它们看起来像这样:

private void countClick(object sender, EventArgs e)
{
    this.BeginInvoke(new Action(() => this.Hide()));
    using (var dlg = new subForm()) {
        dlg.FormClosing += (s, fcea) => { if (!fcea.Cancel) this.Show(); };
        if (dlg.ShowDialog() == DialogResult.OK) {
            // etc...
        }
    }
}

BeginInvoke() 调用是在 ShowDialog() 方法运行后让代码运行的技巧。从而确保在显示对话框窗口后隐藏您的窗口。对话框的 FormClosing 事件用于使窗口在对话框关闭之前再次可见。

于 2013-06-25T02:18:15.640 回答
0

您需要找到某种方法将对主窗体的引用传递给第二个窗体单击事件处理程序。

您可以通过将表单设置为第二个表单类的成员变量或通过事件参数传递它来做到这一点。

于 2013-06-25T00:48:21.443 回答
0

如果你在同一个命名空间中工作,你有上下文,使用mainform或你给“主要形式”的名字,试试:

mainform.show();
于 2013-06-25T00:42:30.710 回答