首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从子窗体打开窗体并在主窗体面板中显示

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

Stack Overflow用户
提问于 2021-01-28 03:38:46
回答 2查看 105关注 0票数 1

我目前正在用C# Visual Studio2017开发一个Windows Form应用程序,并决定使用tutorial seen here实现一个侧面板菜单。

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

代码语言:javascript
运行
复制
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();
    }

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-28 03:59:22

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

代码语言:javascript
运行
复制
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();
     }
}

然后,在您的子窗体中,您可以调用该静态类来更改窗体。

代码语言:javascript
运行
复制
public class ChildForm{
    private void btn_click(...){
        FormController.openChildForm(<newChildForm>);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-28 03:50:45

您可以使用事件来处理此操作:

步骤1)创建一个从Form继承的新类。这将是您所有孩子的窗体的基类。您可以将此ChildForm (继承自)表单命名为。

步骤2)定义一个新的公共事件,您可以从更改子窗体的函数绑定到该事件。

它可能看起来像这样:

代码语言:javascript
运行
复制
public event EventHandler OnRequestChildChange;

步骤3)在您想要请求更改的孩子中,您可以调用以下代码:

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)绑定到main函数中的事件

代码语言:javascript
运行
复制
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‘,它将在子请求时通过创建新实例或拉出所需新窗体的本地实例并调用上面的方法来处理交换窗体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65926195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档