隐藏面板中的控件直到我调整窗口大小

时间:2019-01-03 14:33:05

标签: .net winforms label panel groupbox

我一直在控制面板上的“中断”问题。但是,当我手动开始调整表单大小时,每次调整大小后,缺少的控件都会重新出现。 我创建了一个测试应用程序来显示此问题。 该应用程序本身会在主窗体上添加一个面板。 在此面板中,我添加了10个分组框,每个分组框都有100个标签。 以下是创建测试应用并重现问题的步骤(到目前为止,我仅在.NET 4.6.1和Visual Studio 2017中尝试过此步骤)

  • 创建一个新的Windows窗体项目
  • 将默认表单的构造函数更新为以下形式

    public Form1()
    {
        InitializeComponent();
    
        // My stuff
        var panContents = new Panel();
        panContents.AutoScroll = true;
        panContents.AutoSize = true;
        panContents.AutoSizeMode = AutoSizeMode.GrowAndShrink;
        panContents.Dock = DockStyle.Fill;
        for (int g = 10; g >= 0; g--)
        {
            var groupBox = new GroupBox();
            groupBox.AutoSize = true;
            groupBox.AutoSizeMode = AutoSizeMode.GrowOnly;
            groupBox.Dock = DockStyle.Top;
            groupBox.Text = "Group " + g;
    
            var mainPanel = new Panel();
            mainPanel.Dock = DockStyle.Fill;
            mainPanel.AutoSize = true;
            mainPanel.AutoSizeMode = AutoSizeMode.GrowOnly;
            for (int i = 100; i >= 0; i--)
            {
                var con = new Label();
                con.Text = "Label " + i;
                con.Height = 100;
                con.Dock = DockStyle.Top;
                mainPanel.Controls.Add(con);
            }
            groupBox.Controls.Add(mainPanel);
            panContents.Controls.Add(groupBox);
        }
    
        this.Controls.Add(panContents);
    }
    
  • 运行项目(不调整表单大小)

  • 滚动到表单底部附近,您会发现并非所有10个分组框都已呈现
  • 手动调整表单大小,您会发现一些缺少的标签和组框开始出现
  • 保持调整表单的大小,直到显示所有控件

任何人都知道为什么会这样吗?我认为可能与面板尺寸的限制有关。但是,如果是这种情况,我不希望调整窗体的大小以开始显示这些缺少的控件。

PS我知道我可以通过使用制表符或分页来解决此问题。但是我想知道为什么我看到自己的行为(理想情况下我想避免使用制表符或分页)

1 个答案:

答案 0 :(得分:0)

@是,

这是一个相当有趣的问题-在加载/运行代​​码之前还不太了解它。我碰巧同意Jimi的看法,即您可能会遇到内部限制,但是这种限制似乎很奇怪。正如您所指出的那样,调整表单的高度/宽度不应克服限制。因此,无论内部发生什么,这都是有点奇怪和意外的事情。

但是我为您提供了一个解决方案:诚然,这是一种麻烦,但有时这是我们唯一的选择。如果您的项目规格需要一种与您提出的形式一样的形式,即最终高度值超过100,000的形式,则此解决方案应符合要求。

将以下代码添加到Form1初始化代码的末尾,如原始文章中所示(请参见下文)。我所做的只是以编程方式“微调”了表格的高度,直到所有面板都完全渲染为止。我认为这将是您最好的选择。

记录下来,我花了很多时间。我在各种控件,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();