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

原文 标签 c# winforms size autosize

我正在用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# - C#-类型约束和限制,是否有任何解决方法来保持类型安全?

c# - 是否可以在运行时使用两个不同的Owin启动文件?

c# - 多个折线图中的垂直线,在Winforms中为每个图表显示值

c# - 单击多个文本框的事件

javascript - 即使将jQuery脚本定位为iFrame,iFrame也不会扩展到完整的内容高度

html5 - 画布上的大字体在Chrome中需要很长时间

c# - 如何在C#Web应用程序的不同<td>标记中的标签和文本框之间给空格?

c# - 我如何使用MySqlParameterCollection.AddRange

c# - 如何读取程序加载时解决方案一部分的文件?

java - CN1中容器的尺寸/调整大小标签和按钮