Определить размер метки на основе объема текста и размера шрифта в Winforms / C # - PullRequest
40 голосов
/ 23 декабря 2008

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

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

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

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

Заранее спасибо.

Ответы [ 10 ]

91 голосов
/ 23 декабря 2008

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

        using(Graphics g = CreateGraphics()) {
            SizeF size = g.MeasureString(text, lbl.Font, 495);
            lbl.Height = (int) Math.Ceiling(size.Height);
            lbl.Text = text;
        }
33 голосов
/ 23 декабря 2008

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

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

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

9 голосов
/ 23 декабря 2008

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

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

5 голосов
/ 07 ноября 2012
Size maxSize = new Size(495, int.MaxValue);
_label.Height = TextRenderer.MeasureText(_label.Text , _label.Font, maxSize).Height;
2 голосов
/ 26 ноября 2009

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

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

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

1 голос
/ 30 мая 2012

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

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

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

0 голосов
/ 28 декабря 2016

В некоторых случаях, когда вы должны использовать компактный каркас, в котором нет никаких методов переопределения для 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;
    }
0 голосов
/ 09 июня 2015

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

0 голосов
/ 31 марта 2009

Есть ли какой-либо недостаток в использовании класса TextRenderer для измерения строки (как в ответе Марка) вместо выполнения работы по созданию объекта Graphics и т. Д.?

0 голосов
/ 23 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...