Подтвердить что ты не робот

Как выполнить автоматическую настройку высоты метки, но не ширины

У меня есть Panel, который я создаю программно; Кроме того, я добавляю к нему несколько компонентов.

Один из этих компонентов - это Label, который будет содержать пользовательский контент.

Я не знаю, насколько высока метка, но она имеет фиксированную ширину.

Как настроить высоту так, чтобы она отображала весь текст без изменения ширины?

4b9b3361

Ответ 1

Просто используйте свойство AutoSize, установите его на True.

Задайте свойство MaximumSize, например, (60, 0), чтобы он не мог расти горизонтально, только вертикально.

Ответ 2

Используйте Graphics.MeasureString:

public SizeF MeasureString(
    string text,
    Font font,
    int width
)

Параметр width указывает максимальное значение компонента ширины возвращенной структуры SizeF (Ширина). Если параметр ширины меньше фактической ширины string, возвращаемый компонент Width усекается до значения, представляющего максимальное количество символов, которые будет соответствовать указанной ширине. Чтобы разместить всю строку, Возвращаемый компонент высоты настраивается к значению, которое позволяет отображать строка с переносом символов.

Другими словами, эта функция может вычислять высоту вашей строки на основе ее ширины.

Ответ 3

Если у вас есть метка, и вы хотите контролировать вертикальную подгонку, вы можете сделать следующее:

MyLabel.MaximumSize = new Size(MyLabel.Width, 0)
MyLabel.Height = MyLabel.PreferredHeight
MyLabel.MaximumSize = new Size(0, 0)

Это полезно, например, если в контейнере есть метка, размер которой может быть изменен. В этом случае вы можете установить свойство Anchor так, чтобы метка была изменена по горизонтали, но не вертикально, а в событии изменения размера вы можете установить высоту с помощью вышеописанного метода.

Чтобы избежать вертикальной установки, которую нужно интерпретировать как новое событие изменения размера, вы можете использовать логическое значение:

bool _inVerticalFit = false;

И в событии изменения размера:

if (_inVerticalFit) return;
_inVerticalFit = true;
MyLabel.MaximumSize = new Size(MyLabel.Width, 0)
MyLabel.Height = MyLabel.PreferredHeight
MyLabel.MaximumSize = new Size(0, 0)
_inVerticalFit = false;