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

Определите размер метки в зависимости от количества текста и размера шрифта в Winforms/С#

Я хотел бы знать, есть ли лучший подход к этой проблеме. Я хочу изменить размер метки (по вертикали), чтобы разместить определенное количество текста. Мой ярлык имеет фиксированную ширину (около 60 символов ширины перед тем, как он должен завернуть), около 495 пикселей. Шрифт также является фиксированным размером (12 точек afaik), но текст отсутствует.

Что я хочу сделать, это увеличить высоту надписей, когда есть "NewLine" или текст должен быть обернут; идея заключается в том, что текст полностью отображается на этикетке. AutoSize не работает, потому что он будет расти по ширине, а не по высоте.

Конечно, я мог бы подсчитать количество NewLines и добавить: Newlines * LineHeight, а затем - чтобы мне удалось установить 60 символов в строке, просто разделите количество символов и добавьте столько пикселей LinHeight, сколько необходимо.

Мне было интересно, есть ли более профессиональный способ сделать это. Является ли мой подход слишком "хромым"?

Спасибо заранее.

4b9b3361

Ответ 1

Как насчет Graphics.MeasureString, с перегрузкой, которая принимает строку, шрифт и максимальную ширину? Это возвращает a SizeF, поэтому вы можете округлить округление Height.

        using(Graphics g = CreateGraphics()) {
            SizeF size = g.MeasureString(text, lbl.Font, 495);
            lbl.Height = (int) Math.Ceiling(size.Height);
            lbl.Text = text;
        }

Ответ 2

System.Drawing.Graphics имеет метод MeasureString, который вы можете использовать для этой цели. Используйте перегрузку, которая берет строку, шрифт и параметр "ширина"; этот последний параметр указывает максимальную ширину, разрешенную для строки, - используйте ширину набора вашей метки для этого параметра.

MeasureString возвращает объект SizeF. Используйте свойство Height этого возвращенного объекта, чтобы установить высоту метки.

Примечание. Чтобы получить объект Graphics для этой цели, вы можете вызвать this.CreateGraphics.

Ответ 3

Graphics.MeasureString(), вероятно, поможет вам.

Это также одно из единственных способов использования вызова Control.CreateGraphics()!

Ответ 4

Size maxSize = new Size(495, int.MaxValue);
_label.Height = TextRenderer.MeasureText(_label.Text , _label.Font, maxSize).Height;

Ответ 5

Этот "ответ" предназначен для дальнейшего использования и для борьбы с первоначальным допущением, что AutoSize = true означает, что он (метка WinForms) никогда не будет расти в высоту.

Следующая ссылка показывает различные эффекты AutoSize = true с другими свойствами, такими как MaximumSize. В зависимости от ожидаемого использования вопроса может быть целесообразным следовать одному из этих подходов.

http://blogs.msdn.com/jfoscoding/articles/478299.aspx

Ответ 6

Я разместил пользовательский элемент управления, который решает эту проблему в принятом ответе здесь: Автомасштабировать шрифт в элементе управления TextBox, чтобы он был как можно большим и по-прежнему вписывался в рамки текстовой области

Элемент управления расширяет RichTextBox. У этого метода есть метод: ScaleFontToFit, который автоматически изменяет размер шрифта, чтобы сделать весь текст подходящим.

Аккуратно соблюдается многолистное свойство. Если это правда, это позволяет слова обертывать, иначе это не так.

Ответ 7

Ну, 60 символов могут быть действительны для вашего тестового текста, но не все символы имеют одинаковую ширину. Например, сравните llllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
и
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

Оба они имеют 60 символов и имеют значительно различающиеся ширины.

Ответ 8

Есть ли недостаток в использовании класса TextRenderer для измерения строки (например, в ответе Marc) вместо прохождения работы создать объект Graphics и т.д.

Ответ 9

В соответствии с этой статьей вы должны использовать TextRenderer, если вы собираетесь использовать элемент управления Windows Form для окончательного вывода. TextRenderer и Graphics.MeasureString дадут разные результаты, поэтому используйте ту, которая соответствует вашему окончательному режиму вывода.

Ответ 10

В некоторых случаях, когда вы должны использовать компактную структуру, которая не имеет каких-либо переопределяющих методов для MeasureString(), вы можете сами вычислить высоту.

private int YukseklikAyarla(string p, Font font, int maxWidth)
    {
        int iHeight = 0;
        using (Graphics g = CreateGraphics())
        {
            var sizes = g.MeasureString(p, font); // THE ONLY METHOD WE ARE ALLOWED TO USE
            iHeight = (int)Math.Round(sizes.Height);
            var multiplier = (int)Math.Round((double)sizes.Width) / maxWidth; // DIVIDING THE TEXT WIDTH TO SEE HOW MANY LINES IT CAN HAS
            if (multiplier > 0)
            {
                iHeight = (int)(iHeight * (multiplier + 1)); // WE ADD 1 HERE BECAUSE THE TEXT ALREADY HAS A LINE
            }
        }
        return iHeight;
    }