隐藏一个表单,切换到第二个表单,关闭第二个窗体并取消隐藏第一个窗体

本文关键字:表单 隐藏 第二个 窗体 第一个 取消 一个 | 更新日期: 2023-09-27 18:19:48

我已经查看了所有建议的答案,但似乎没有什么符合我想要的。我想从主窗体调用第二个窗体,在第二个活动窗体时隐藏主窗体,然后在第二窗体关闭时取消隐藏主窗体。基本上,我想在这两种形式之间"切换"。

到目前为止,我有:

在我的主要形式:

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

在我的第二个表格中,我有:

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

如何显示主窗体?

隐藏一个表单,切换到第二个表单,关闭第二个窗体并取消隐藏第一个窗体

ShowDialog以ModalDialog的形式打开您的辅助窗体,这意味着MainForm的代码执行将在此时停止,您的辅助表单将成为焦点。所以您所需要做的就是在ShowDialog调用之后放置一个this.Show

来自以上链接:

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

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

假设在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
    }

Form2Closed时,它将是Unhide Form1

   private void frm2_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Show(); // Unhide Form1
    }

这很难正确执行。问题是必须避免根本没有可以获得焦点的窗口。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事件用于在对话框关闭之前使窗口再次可见。

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

您可以将表单设置为第二个表单类的成员变量,也可以通过事件参数传递表单。

如果您在同一个命名空间中工作,您有上下文,使用mainform或您赋予"主窗体"的名称,请尝试:

mainform.show();