如何从子窗体打开窗体并在主窗体面板中显示

How to open form from Child Form and show in main form panel

我目前正在使用 C# Visual Studio 2017 开发 Windows 表单应用程序,并决定使用教程 seen here.

实现侧面板菜单

单击时显示子窗体非常有用,但是我想知道如何在子窗体代码中用新的子窗体替换当前的子窗体。 IE。如何在子表单代码中访问主表单。

private Form activeForm = null;
    private void openChildForm(Form childForm)
    {
        if (activeForm != null)
            activeForm.Close();
        activeForm = childForm;
        childForm.TopLevel = false;
        childForm.FormBorderStyle = FormBorderStyle.None;
        childForm.Dock = DockStyle.Fill;
        childFormPanel.Controls.Add(childForm);
        childFormPanel.Tag = childForm;
        childForm.BringToFront();
        childForm.Show();
    }

这就是在主窗体中打开子窗体的方式。如何通过子窗体访问此方法? 我相信这可能会让人感到困惑,但如果您快速浏览一下视频,就会明白我的意思。

谢谢!

您可以使用事件来处理:

步骤 1) 创建一个新的 class 继承自 Form。这将是您所有 children 表格的基础 class。您可以调用此 ChildForm(继承自)Form。

步骤 2) 定义一个新的 public 事件,您可以从更改 child 表单的函数绑定到该事件。

可能看起来像这样:

public event EventHandler OnRequestChildChange;

第 3 步)在您想要请求更改的 child 中,您可以调用此:

OnRequestChildChange?.Invoke(null); //这也会传递你的参数,所以你可以创建一个事件,允许你传递自定义参数并传递名称或表单类型,并在你的事件处理程序中有一个 switch 语句。

自定义事件: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-publish-events-that-conform-to-net-framework-guidelines

步骤 4) 绑定到主函数中的事件

private ChildForm activeForm = null;
private void openChildForm(ChildForm childForm)
{
  if (activeForm != null){
    activeForm.OnRequestChildChange -= Child_RequestChange;
    activeForm.Close();
  }

  activeForm = childForm;
  activeForm.OnRequestChildChange += Child_RequestChange;
  childForm.TopLevel = false;
  childForm.FormBorderStyle = FormBorderStyle.None;
  childForm.Dock = DockStyle.Fill;
  childFormPanel.Controls.Add(childForm);
  childFormPanel.Tag = childForm;
  childForm.BringToFront();
  childForm.Show();
}

第 5 步)创建事件处理程序 'Child_RequestChange',它将在 child 请求时通过创建新实例或拉取所需新表单的本地实例并调用来处理表单交换上面的方法。

可以使用保留主窗体实例的静态 class。当您加载主窗体时,在 FormController class 中设置 MainForm static 属性。然后从您的子表单中调用 FormControll.openChildForm(...);

public static FormController{
    public static Form MainForm {get;set;}
    
    private static Form activeForm = null;
    public static void openChildForm(Form childForm)
    {
       if (activeForm != null)
          activeForm.Close();
       activeForm = childForm;
       MainForm.childForm.TopLevel = false;
       MainForm.childForm.FormBorderStyle = FormBorderStyle.None;
       MainForm.childForm.Dock = DockStyle.Fill;
       MainForm.childFormPanel.Controls.Add(childForm);
       MainForm.childFormPanel.Tag = childForm;
       MainForm.childForm.BringToFront();
       MainForm.childForm.Show();
     }
}

然后在您的子表单中,您可以调用该静态 class 来更改表单。

public class ChildForm{
    private void btn_click(...){
        FormController.openChildForm(<newChildForm>);
    }
}