在一个窗体下为不同的页面形成多个用户控件

本文关键字:控件 用户 一个 窗体 | 更新日期: 2023-09-27 17:59:40

我正在尝试使用Winform构建一个应用程序UI,其中将有多个页面。假设软件在启动时会要求提供登录凭据,然后登录到仪表板。然后,用户可以选择转到不同的页面,如:第1页-第2页-第3页。

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

现在,为了做到这一点,我将以下代码放入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);

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

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

你的实际问题似乎是:如何引用那些UC的表格?

这与以下问题密切相关:如何从其他形式中引用一个形式或其部分?这里经常有人问这个问题。。

以下是我建议你应该做的:

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

在你写的表格中:

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;

现在你可以引用表单中的所有公共字段和方法,也许像这个

if (logingIsOK) mainForm.openPageOne();