TableLayoutPanel 拉伸以填充表单中的父面板

TableLayoutPanel stretch to fill parent panel in form

我正在制作一个应该独立于分辨率的 WinForms GUI(即所有控件 stretch/shrink 保持原位,无论用户的分辨率如何)。

我的问题是:出于某种原因,只要表单正在收缩而不是拉伸,我的所有控件都可以完美地调整大小。

如果用户调整 window 的大小以使其变小(完成后,它将锁定为最大化,但出于测试目的,我将其保留为可调整大小),所有控件在window中效仿。如果用户将 window 拉伸到超过其初始大小,控件将保留在原位,这反过来意味着它们不再处于正确的位置,因为 window 现在更大了。它们从非常小的大小调整到初始大小,然后就停止了;而 window 继续增长。

我的布局如下:

Main form
   --> 1x3 TableLayoutPanel
      --> 1x1 TableLayoutPanel in center row of parent panel
         --> User control that populates parent 1x1 TableLayoutPanel on button click

            User Control
               --> 1x1 TableLayoutPanel
                  --> Multiple TableLayoutPanel's laying out multiple controls inside parent 1x1 TableLayoutPanel

我所有的面板都设置为锚点TOP/BOTTOM/LEFT/RIGHT

我已经为每个主面板尝试了自动调整大小、增长样式、停靠和锚点的不同组合,但似乎无法让我的主面板(即包含用户控件的面板)调整到比初始面板更大的大小尺寸。

我希望我已经很好地描述了我的问题,但基本上;我的项目布局由每个自定义控件的彼此内部的许多 TableLayoutPanel 组成,并且该自定义控件在我的主窗体中填充一个 1x1 TableLayoutPanel,它充当我的 GUI 的 "Main" 面板。然后,用户使用位于父 1x3 TableLayoutPanel 顶行的按钮选择要在主窗体上显示的用户控件。

如果我需要更好地解释这个问题以便您回答,请告诉我


编辑: 我发现如果我将用户控件的 AutoScaleMode 设置为 Font,它将完全按照我想要的方式调整大小。这个解决方案的唯一问题是,当控件加载到窗体中时,它太大了,其中一些被我的主窗体的边缘切断了。一旦我手动调整表单的大小(即使是一点点),控件就会自行修复到表单内的适当大小。

所以我觉得我很接近,但还不够,因为对于成品,用户将无法控制 window 的大小调整,它将被强制最大化。

编辑 2: 我尝试将其添加到在面板中显示用户控件的按钮事件中:

            MyUserControl MainPanelControls = new MyUserControl();
            MainPanel.SuspendLayout();
            MainPanel.Controls.Clear();
            MainPanel.Controls.Add(MainPanelControls); 
            MainPanel.Dock = DockStyle.Fill;  //This seems to have no effect               
            MainPanel.ResumeLayout(false);

原来唯一的问题是出于某种原因我有 MainPanel.ResumeLayout(false); 而不是 true。我不确定为什么将其设置为 false,但现在一切正常。

所以回答我自己的问题:

为了使用户控件正确缩放,我必须将它的 AutoScaleMode 设置为 Font 然后在将用户控件添加到主 TableLayoutPanel 的按钮事件上我必须更改 MainPanel.ResumeLayout(false)MainPanel.ResumeLayout()

private void Button1_Click(object sender, EventArgs e)
       {
        MyUserControl MainPanelControls = new MyUserControl();
        MainPanel.SuspendLayout();
        MainPanel.Controls.Clear();
        MainPanel.Controls.Add(MainPanelControls);             
        MainPanel.ResumeLayout();
       }