Моя задача это задать 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;
Но ширина получается больше чем текст! В чем ошибка ?
У вас две ошибки в коде:
Вы создаете новый Label только для того, чтобы получить шрифт по умолчанию new Label().Font
, причем создаете даже не для строки, а для каждого символа(!!). Даже если забыть про варварский расход памяти и, в итоге, нагрузку на GC, вы сами себе запретили менять шрифт Label
, для которого считаете длину, т.к. размер не будет совпадать, если вы захотите поменять шрифт. Шрифт должен быть параметром вашей функции.
Вы считаете размер строки как сумму размеров символов, но это не может дать верный результат, т.к. для всех шрифтов, исключая моноширные (все символы одинаковой ширины), используется оптимизация расстояния между символами - кёрнинг (можно отключить вручную, но в приведенном коде этого нет), из чего следует, что сумма ширин символов не будет равна ширине строки целиком. Передавайте в MeasureText
строку целиком, не нужно дробить ее на символы.
Пытаюсь правильно прервать выполнение функции через token, однако task остается всегда в состоянии RanToCompletionПодскажите пожалуйста, в чем проблема?
Есть группа методов, выполняемых асинхронноЗапуск метода на исполнение выполняется следующим образом