LinkLabel требуется больше места, чем говорит TextRenderer.MeasureText

StackOverflow https://stackoverflow.com/questions/952518

Вопрос

Если я передам TextRenderer.MeasureText некоторый текст для измерения и ширину для использования, он вернет высоту, необходимую для отображения этого текста.

private static int CalculateHeight(string text, Font font, int width)
{
    Size size = TextRenderer.MeasureText(text, font, new Size(width, Int32.MaxValue), TextFormatFlags.NoClipping | TextFormatFlags.WordBreak);
    return size.Height;
}

Если я передам этот текст, ширину и высоту LinkLabel, он отобразит текст с указанной шириной и высотой, без каких-либо обрезаний.

Однако, если я помещу ссылку в коллекцию LinkLabel.Links, LinkLabel отрисует текст с немного большим расстоянием между символами, и иногда это приведет к обрезанию конца текста.Есть ли способ предотвратить это?Я пробовал добавлять отступы при наличии ссылки, но нет надежного способа точно узнать, сколько еще места потребуется.Есть ли другие способы сделать это?

Это было полезно?

Решение

Вы должны использовать Control.GetPreferredSize метод для расчета ширины или высоты, необходимой для управления (в вашем случае LinkLabel).Не следует использовать MeasureText для таких целей, более подробное объяснение вы можете найти здесь (точность результатов TextRenderer.MeasureText.)

Другие советы

Если LinkLabel содержит более одной ссылки или есть части текста, которых нет в ссылке, тогда элемент управления использует Graphics.DrawString/MeasureString вместо TextRenderer.DrawText/MeasureText.Вы можете легко увидеть это в действии, самая большая разница в рендеринге связана с маленькой буквой L:

linkLabel1.Text = new string('l', 100); // 100 x small L
linkLabel1.LinkArea = new LinkArea(0, 50);
linkLabel2.Text = new string('l', 100); // 100 x small L 

TextRenderer.MeasureText — это управляемая оболочка для DrawTextEx API.Возвращаемое значение берется из структуры lprc.Возможно, вы захотите просмотреть этот API для получения более подробной информации.

Я думаю, вы могли бы удалить стиль, который подчеркивает его. linkLabel.Styles.Add("text-decoration", "none"); но тогда, конечно, это не будет похоже на ссылку.:-/

Думаю, другим решением было бы добавить отступ самостоятельно.

int heightBefore = linkLabel.Height;
int fontHeight = CalculateHeight(linkLabel.Text, linkLabel.Font, linkLabel.Width);
int paddingHeight = heightBefore - fontHeight;
linkLabel.Font = otherFont;
linkLabel.Height = CalculateHeight(linkLabel.Text, otherFont, linkLabel.Width);
linkLabel.Height += paddingHeight;

Не самое красивое решение, но я думаю, оно работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top