Свойство preferredSize не соответствует getPreferredSize

#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. Вы должны указать это в ответе и принять его, чтобы этот вопрос был помечен как решенный.