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.

http://msdn.microsoft.com/en-us/library/6xe5hazb.aspx

ToSize() усекает значения SizeF до следующих более низких целочисленных значений.

Итак, чтобы избежать потерь, вы можете сделать что-то подобное:

l.Size = (CreateGraphics().MeasureString(_name, l.Font) + new SizeF(1, 0)).ToSize();

Это так просто, как получить неправильный размер, когда вы объявляете свой шрифт по сравнению с размером шрифта пользовательского интерфейса?

Другие вопросы по тегам