MeasureString() не возвращает достаточную ширину
У меня есть следующий код для создания Label
на PictureBox
:
Label l = new Label();
l.Text = _name;
l.Size = CreateGraphics().MeasureString(_name, l.Font).ToSize();
l.BackColor = Color.White;
но метка всегда сбрасывает последний символ. Если я добавлю символ к вызову:
l.Size = CreateGraphics().MeasureString(_name+".", l.Font).ToSize();
это работает хорошо, но это не правильно.
Кажется, перед текстом на этикетке есть пробел, но Padding
установлен на 0. Как я могу исправить это правильным способом?
3 ответа
Вы не можете использовать AutoSize
имущество?
MeasureString
общеизвестно неточно, хотя обычно возвращает размер больше, чем вы ожидаете:
Метод MeasureString предназначен для использования с отдельными строками и включает небольшое количество дополнительного пространства до и после строки, чтобы можно было использовать нависающие глифы. Кроме того, метод DrawString настраивает точки глифа для оптимизации качества отображения и может отображать строку более узкую, чем сообщается MeasureString. Чтобы получить метрики, подходящие для смежных строк в макете (например, при реализации форматированного текста), используйте метод MeasureCharacterRanges или один из методов MeasureString, который принимает StringFormat, и передайте GenericTypographic. Кроме того, убедитесь, что TextRenderingHint для графики имеет значение AntiAlias.
ToSize() усекает значения SizeF до следующих более низких целочисленных значений.
Итак, чтобы избежать потерь, вы можете сделать что-то подобное:
l.Size = (CreateGraphics().MeasureString(_name, l.Font) + new SizeF(1, 0)).ToSize();
Это так просто, как получить неправильный размер, когда вы объявляете свой шрифт по сравнению с размером шрифта пользовательского интерфейса?