Когда панели.Размер обновляться после добавления элементов управления на панели.AutoSize = true?

Я создаю GUI в C# используя WinForms.
Я пытаюсь расположить программно созданные панели одна под другой. Поскольку содержимое этой панели может варьироваться в зависимости от их содержимого, я использую 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 и мне нужно использовать эту высоту панели несколько строк под.

1 ответов


Я верю, что происходит то, что размер панели будет определен, когда вы выполните PerformLayout на своем родителе. Вы можете заставить его работать так, как вы хотите, переместив родительскую панель 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();