一个窗体下不同页面的Winform多个用户控件

Winform multiple Usercontrols for different page under one Form

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

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

现在我将下面的代码放入 Form1.cs

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

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

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

例如:

internal void ReplaceUserPage(Control container, UserControl userRequest)
{
    if (container.Controls.Count == 1)
    {
        container.Controls.RemoveAt(0);
    }
    container.Controls.Add(userRequest);
    userRequest.Dock = DockStyle.Fill;
}

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

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

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

我觉得你选择的基本布局很好。

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

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

以下是我建议您应该做的事情:

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

在你写的表格中:

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 中:

public ControlLogin(Form1 form1)
{
    InitializeComponent();
    mainForm = form1;
}

Form1 mainForm = null;

现在您可以在表单中引用所有 public 个字段和方法,可能像这样

if (logingIsOK) mainForm.openPageOne();