Получить ширину текста c#

352
20 сентября 2017, 09:38

Моя задача это задать Label ширину точно подходящую к содержимому в этом Label если текст заранее известен. Авторазмер не предлагать. Получаю ширину по тексту с помошью функции :

public int GetTextLength(string Text)
{
  float Length = 0;
  foreach (char letter in Text.ToCharArray())
  {
    Length += TextRenderer.MeasureText(letter.ToString(), new Label().Font).Width;
  }
  return (int)Length;         
 }

Создаю несколько Label динамически

Label nLaber = new Label();
nLaber.Text = "ЗАРАНЕЕ ИЗВЕСНЫЙ ТЕКСТ";
nLaber.Width = GetTextLength(nLaber.Text);
nLaber.TextAlign = ContentAlignment.MiddleLeft;
nLaber.BackColor = Color.Black;
nLaber.ForeColor = Color.White;

Но ширина получается больше чем текст! В чем ошибка ?

Answer 1

У вас две ошибки в коде:

  1. Вы создаете новый Label только для того, чтобы получить шрифт по умолчанию new Label().Font, причем создаете даже не для строки, а для каждого символа(!!). Даже если забыть про варварский расход памяти и, в итоге, нагрузку на GC, вы сами себе запретили менять шрифт Label, для которого считаете длину, т.к. размер не будет совпадать, если вы захотите поменять шрифт. Шрифт должен быть параметром вашей функции.

  2. Вы считаете размер строки как сумму размеров символов, но это не может дать верный результат, т.к. для всех шрифтов, исключая моноширные (все символы одинаковой ширины), используется оптимизация расстояния между символами - кёрнинг (можно отключить вручную, но в приведенном коде этого нет), из чего следует, что сумма ширин символов не будет равна ширине строки целиком. Передавайте в MeasureText строку целиком, не нужно дробить ее на символы.

READ ALSO
После cancelTokenSource.Cancel() , Task остается в состоянии RanToCompletion

После cancelTokenSource.Cancel() , Task остается в состоянии RanToCompletion

Пытаюсь правильно прервать выполнение функции через token, однако task остается всегда в состоянии RanToCompletionПодскажите пожалуйста, в чем проблема?

221
Выполнение кода в блоке try/catch

Выполнение кода в блоке try/catch

Есть группа методов, выполняемых асинхронноЗапуск метода на исполнение выполняется следующим образом

214
Чтение содержимого сайта [дубликат]

Чтение содержимого сайта [дубликат]

На данный вопрос уже ответили:

246