#winforms
#winforms
Вопрос:
Я пытаюсь написать элемент управления меню, который будет автоматически изменять размер в зависимости от длины текста, который он содержит (например, элемент управления Label).
Чтобы сделать это, я переопределил метод getPreferredSize для вычисления длины текста:
public override Size GetPreferredSize(Size proposedSize)
{
Size size = TextRenderer.MeasureText(this.Text, this.Font);
int w = size.Width this.Padding.Left this.Padding.Right;
int h = size.Height this.Padding.Top this.Padding.Bottom;
return new Size(w, h);
}
Затем я добавляю кучу этих элементов управления в содержащий элемент управления menu и пытаюсь расположить их на основе указанного выше размера:
if (item.AutoSize)
{
item.Size = item.PreferredSize;
}
item.Left = _Left;
item.Top = _Top;
if (this.MenuOrientation == Orientation.Vertical)
{
_Top = item.Size.Height;
}
else
{
_Left = item.Size.Width;
}
this.Controls.Add(item);
Однако размеры, возвращаемые preferredSize и getPreferredSize, не совпадают. Для одной строки getPreferredSize возвращает {Width=147, Height=27}, но preferredSize возвращает {Width=105, Height = 21}. Из-за этого элементы управления перекрываются вместо того, чтобы отображаться рядом друг с другом.
Я попытался переопределить MinimumSize вместо getPreferredSize, но это также уменьшилось по сравнению с тем, что я рассчитал.
Итак, мой вопрос в том, как правильно это сделать? Я также хотел бы понять, каким образом AutoSize, preferredSize, MinimumSize и MaximumSize предназначены для взаимодействия. MSDN мало помогает в этом.
Комментарии:
1. Вместо того, чтобы наследовать панель управления контейнером, я изменил ее на наследование FlowLayoutPanel вместо этого. После этого это сработало, несмотря на все волшебства, происходящие с preferredSize / getPreferredSize .
2. Вы должны указать это в ответе и принять его, чтобы этот вопрос был помечен как решенный.