LinkLabel нужно больше места, чем TextRenderer.MeasureText говорит - PullRequest
2 голосов
/ 04 июня 2009

Если я дам 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 будет рисовать текст с небольшим интервалом между символами, что иногда приводит к обрезанию конца текста. Есть ли способ предотвратить это? Я пробовал добавлять отступы, когда есть ссылка, но нет надежного способа точно узнать, сколько еще места потребуется. Есть ли другие способы сделать это?

Ответы [ 4 ]

2 голосов
/ 29 июля 2009

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

1 голос
/ 29 июля 2009

Если 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 
0 голосов
/ 06 июня 2009

Я думаю, вы можете удалить стиль, который подчеркивает его. 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;

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

0 голосов
/ 05 июня 2009

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

...