关于 c#:Winform 一个 Form 下不同页面的多个 Usercontrols

Winform multiple Usercontrols for different page under one Form

我正在尝试使用 Winform 构建一个应用程序 UI,其中将包含多个页面。假设软件将在启动时要求登录凭据,然后登陆仪表板。然后用户将可以选择转到不同的页面,例如:Page1 - Page2 - Page3。

现在我计划制作一个表单,所有这些页面都将是单独的用户控件。因此,根据要求,我将更改这些用户控件的可见性。

现在要做到这一点,我将下面的代码放入 Form1.cs

1
2
3
  ControlLogin ucLogin = new ControlLogin();
  ucLogin.Location = new System.Drawing.Point(12, 67);
  this.Controls.Add(ucLogin);

这很好用。但是,在从此 ControlLogin.cs 打开任何 UserControl 时,我将如何将新的 UserControl(比如 Page1Control)添加到 Form1 的列表中?


你选择的基本布局对我来说很好。

您的实际问题似乎是:如何从这些 UC 中引用表单?

这与以下问题密切相关:如何从其他表单中引用一个表单或其中的一部分?这里经常被问到这个问题..

这是我建议你应该做的:

  • 创建一个公共函数来打开你的每个 UCs openLogin, openPageOne..
  • 更改每个 UC 的构造函数以包含一个 Form1 作为参数(假设您的表单具有默认名称)并相应地调用它,如下所示: ControlLogin ucLogin = new ControlLogin(this);
  • 在 UC 构造函数中,您希望将传入的表单存储在类变量中。
  • 以你写的形式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void openLogin(Form1 f)
    {
      ControlLogin ucLogin = new ControlLogin(this);
      ucLogin.Location = new System.Drawing.Point(12, 67);
      this.Controls.Add(ucLogin);
    }


    public void openPageOne(Form1 f)
    {
      ..
    }

    在 UC 中:

    1
    2
    3
    4
    5
    6
    7
    public ControlLogin(Form1 form1)
    {
        InitializeComponent();
        mainForm = form1;
    }

    Form1 mainForm = null;

    现在你可以在表单中引用所有的公共字段和方法了,可能是这样的

    1
    if (logingIsOK) mainForm.openPageOne();


    您需要为您的页面开发一些事务逻辑。我建议在您的主窗体上使用面板作为容器。在此容器中,您将放置当前用户控件,即用户选择的控件。

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    internal void ReplaceUserPage(Control container, UserControl userRequest)
    {
        if (container.Controls.Count == 1)
        {
            container.Controls.RemoveAt(0);
        }
        container.Controls.Add(userRequest);
        userRequest.Dock = DockStyle.Fill;
    }

    如果您没有动态页面,则可以将它们全部设为单例。这样,每个实例都将按需创建并存在于内存中,随时可以重用。因此,当用户单击菜单或按钮打开页面时,您可以执行

    1
    2
    UserControl requested = Page1Control.GetInstance();
    ReplaceUserPage(container, requested);

    使用单例,您甚至不需要保留控件列表。我并不是说这是最好的、完美的或一刀切的方式。有许多控制事务方法。这取决于系统复杂性和其他因素。