Пользовательский элемент управления со свойством auto-height

Я хочу создать пользовательский элемент управления, который будет отображать текст.
Мне нужен способ изменить размер элемента управления во время выполнения, чтобы он отрегулировал высоту, чтобы показать весь текст. Я создал элемент управления, который выглядит следующим образом:

Как видите, у меня есть значок и текст, нарисованный с помощьюTextRenderer.DrawText, К сожалению, когда я изменяю размер своего элемента управления (только влево или вправо), мой текст иногда обрезается, задница показана ниже:

Я измеряю текст с помощьюTextRenderer.MeasureText исходя из этого, я считаю количество строк, а затем я рисую этот текст. Вот код, который я использую:

[Designer(typeof(MyTextBoxDesigner))]
public partial class MyTextBox : UserControl
{
    public MyTextBox()
    {
        InitializeComponent();
    }

    [DefaultValue("Demo"), Description("Text of control"), Category("Appearance"),Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            if (base.Text == value) return;
            base.Text = value;
            Invalidate();
        }
    }

    Image _image;
    [Description("Image shown on the left side of the control"),
    Category("Appearance")]
    public Image Image
    {
        get
        {
            return _image;
        }
        set
        {
            if (_image == value) return;
            _image = value;
            Invalidate();
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        int imagePadding = 0;
        if (_image != null)
        {
            imagePadding = 25;
            e.Graphics.DrawImage(_image,new Rectangle(5,5,16,16));
        }
        Size textSize1 = TextRenderer.MeasureText(e.Graphics, Text, Font);
        SizeF textSize2 = e.Graphics.MeasureString(Text, Font);

        Debug.WriteLine(textSize2);

        int maxTextWidth = Width - Padding.Left-Padding.Right-imagePadding;
        int lineHeight = textSize1.Height + 2;
        int numLines = 1;

        if (textSize1.Width > maxTextWidth)
        {
            numLines = textSize1.Width / maxTextWidth + 1;
        }

        Rectangle textRect = new Rectangle
        {
            Width = Width - Padding.Left-Padding.Right-imagePadding,
            Height = (numLines * lineHeight),
            X = Padding.Left+imagePadding,
            Y = 5
        };

        TextRenderer.DrawText(e.Graphics, Text, Font, textRect, ForeColor, TextFormatFlags.WordBreak | TextFormatFlags.Left | TextFormatFlags.Top);

        e.Graphics.DrawRectangle(Pens.CadetBlue, textRect);

        base.OnPaint(e);
    }
}

internal class MyTextBoxDesigner : ControlDesigner
{
    public override SelectionRules SelectionRules
    {
        get
        {
            //all minus bottom and top
            return (base.SelectionRules & ~(SelectionRules.BottomSizeable | SelectionRules.TopSizeable));
        }
    }
}

В идеале я хотел бы, чтобы мой элемент управления автоматически настраивал высоту на основе длины текста, поэтому, если текст короткий (или достаточно длинный), например, будет иметь высоту 20 пикселей, но если текст длинный, мой элемент управления должен быть (например) 40 пикселей высота (2 строки текста).

Как мне изменить мой текст измерения для расчетаtextRect правильно?
Должен ли я обновить высоту моего элемента управления, используя свойство Size, или есть лучший способ?

РЕДАКТИРОВАТЬ: По сути, я хочу нарисовать текст, который можно обернуть внутри прямоугольника, но имеет фиксированную ширину, поэтому, когда текст длиннее, этот прямоугольник будет регулировать его высоту. Затем, основываясь на этой высоте, я хочу настроить высоту управления.

Ответы на вопрос(1)

Ваш ответ на вопрос