Когда панели.Размер обновляться после добавления элементов управления на панели.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();