在我调整 window 大小之前,面板中的控件是隐藏的

Controls in panel are hidden until I resize the window

我一直在使用来自面板的 "cut-off" 控件时遇到问题。但是,当我手动开始调整表单大小时,每次调整大小时,丢失的控件都会重新出现。 我创建了一个测试应用程序来显示此问题。 该应用程序本身在主窗体上添加了一个面板。 在这个面板中,我添加了 10 个组框,每个组框有 100 个标签。 下面是创建测试应用程序和重现问题的步骤(到目前为止,我只在 .NET 4.6.1 和 visual studio 2017 上尝试过)

有人知道为什么会这样吗?我想这可能与面板尺寸的限制有关。但是,如果是这种情况,我不希望调整表单大小以开始显示这些丢失的控件。

PS 我知道我可以通过使用标签或分页来解决这个问题。但是我想知道为什么我会看到我看到的行为(理想情况下我想避免使用标签或分页)

@Yas,

这是一个相当有趣的问题——直到 loading/running 你的代码才完全理解它。我碰巧同意 Jimi 的观点——您可能 运行 面临内部限制,无论这种限制看起来多么奇怪。正如您所指出的,调整表单的 height/width 不应克服限制。因此,无论内部发生什么,都有点奇怪和出乎意料。

但我为您提供了一个解决方案:诚然这是一个难题,但有时这是我们唯一的选择。如果您的项目规范需要一种类似于您提供的形式——一种最终高度值远超过 100,000 的形式,那么此解决方案应该符合要求。

将以下代码添加到 Form1 初始化代码的末尾,显示在您的原始 post 中(见下文)。我所做的是以编程方式 "tweaked" 表单的高度非常轻微——重复——直到所有面板都被完全呈现。我认为这将是您最好的选择。

郑重声明,我在这上面花了很多时间。我曾在各种控件、DoEvents() 等上尝试过 Refresh() 的各种组合,但无济于事。我什至尝试不使用停靠和自动调整大小,而是手动设置顶部和高度(这也不起作用)。因此,我认为除了 Microsoft 的修复之外,下面的代码确实是解决此问题的唯一方法。

** 要使下面的代码正常工作,请在代码的 InitializeComponent() 之后立即添加此行;行:

this.Show();

然后在代码的右大括号后添加此代码:

     // fix the panContents panel
     long currentMaximum = 0;
     while (true)
     {
        var preserveHeight = this.Height;
        // tweak the height
        this.Height += 1;
        // set it back the height
        this.Height = preserveHeight;

        // test to see if the scroll bar max remains at its previous value
        // if it does, we're done
        if (currentMaximum == panContents.VerticalScroll.Maximum)
           break;

        // otherwise, preserve the current maximum scroll bar position
        currentMaximum = panContents.VerticalScroll.Maximum;

        // now scroll to the bottom of the panel
        panContents.VerticalScroll.Value = panContents.VerticalScroll.Maximum;
        // necessary step to ensure scroll bar value is set
        panContents.PerformLayout();
     }

     // scroll to the top
     panContents.VerticalScroll.Value = 0;
     // necessary step to ensure scroll bar value is set
     panContents.PerformLayout();