c# - 在Panel.AutoSize = true时添加控件后,Panel.Size何时更新?

我正在用winforms用c创建一个gui。
我试着将程序创建的面板一个一个地放置在另一个下面。由于这些面板的内容可能因其内容而异,因此我使用Panel.AutoSize让winforms执行正确的大小调整。
问题是:如果在填充Panel.Height后立即使用Panel.Size.Height(或Panel),则返回的值始终是我的默认值。大小调整确实发生了,正如我在启动应用程序时看到的,但我只是不知道什么时候。
以下是我正在做的事情的简化版本:

this.SuspendLayout();

int yPos = 0;
foreach (String entry in entries)
{
    Panel panel = new Panel();
    panel.SuspendLayout();
    panel.AutoSize = true;
    panel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly;
    panel.BackColor = System.Drawing.SystemColors.Window; // Allows to see that the panel is resized for dispay
    panel.Location = new System.Drawing.Point(0, yPos);
    panel.Size = new System.Drawing.Size(this.Width, 0);
    this.Controls.Add(panel);

    Label label = new Label();
    label.AutoSize = true;
    label.Location = new System.Drawing.Point(0, 0);
    label.MaximumSize = new System.Drawing.Size(panel.Width, 0);
    label.Text = entry;
    panel.Controls.Add(label);

    panel.ResumeLayout(false);
    panel.PerformLayout();

    yPos += panel.Height; // When breaking here, panel.Height is worth 0
    yPos += label.Height; // This works perfectly, label.Height was updated according to the text content when breaking at that point
}

this.ResumeLayout(false);
this.PerformLayout();

所以真正的问题是:如何在添加控件之后获得更新的Panel.Size,以获得适当的高度值?
注意:我知道我可以使用TextBox高度,但我发现它不优雅且不切实际,因为在我的实际代码中,Panel中有更多控件,我需要在下面几行使用面板高度。


最佳答案:

我认为,面板的大小将在您在其父面板上执行布局时确定。通过将面板的父SuspendLayout / ResumeLayout代码移动到循环中,您可以使它像您希望的那样工作。

int yPos = 0;
foreach (String entry in entries)
{
    this.SuspendLayout();
    Panel panel = new Panel();
    panel.SuspendLayout();
    panel.AutoSize = true;
    panel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly;
    panel.BackColor = System.Drawing.SystemColors.Window; // Allows to see that the panel is resized for dispay
    panel.Location = new System.Drawing.Point(0, yPos);
    panel.Size = new System.Drawing.Size(this.Width, 0);
    this.Controls.Add(panel);

    Label label = new Label();
    label.AutoSize = true;
    label.Location = new System.Drawing.Point(0, 0);
    label.MaximumSize = new System.Drawing.Size(panel.Width, 0);
    label.Text = entry;
    panel.Controls.Add(label);
    panel.ResumeLayout(true);
    this.ResumeLayout(true);
    yPos += panel.Height; // When breaking here, panel.Height is worth 0
    //yPos += label.Height; // This works perfectly, label.Height was updated according to the text content when breaking at that point
}
this.PerformLayout();

译文:来源   文章分类: c# winforms size autosize

相关文章:

c# - 正确使用HttpContext.Current.User与异步等待的方法

c# - 模拟DbProviderFactory

c# - LINQ to Entities查询不支持强制转换为十进制

c# - 为什么运行应用程序时路由测试失败,但是路由可以正常工作?

c# - 如何保证我的WPF应用程序具有永久管理员特权

c# - 在没有任何第三方/库的情况下,是否还有其他方法可以使用C#中的WPF处理DICOM图像?

c# - IPAddress。[尝试]解析将192.168解析为192.0.0.168

c# - 通过.NET连接到Active Directory

c# - 如何将Stringified JSON传递给C#方法?

c# - 检查浏览器是chrome还是edge