LinkLabel需要比TextRenderer.MeasureText更多的空间

时间:2009-06-04 19:12:04

标签: c# winforms label linklabel textrenderer

如果我给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 个答案:

答案 0 :(得分:2)

您应该使用Control.GetPreferredSize方法计算控件所需的宽度或高度(在您的情况下为LinkLabel)。您不应将MeasureText用于此类目的,您可以找到更详细的解释here (Accuracy of TextRenderer.MeasureText results.)

答案 1 :(得分:1)

如果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 

答案 2 :(得分:0)

TextRenderer.MeasureText是DrawTextEx API的托管包装器。返回的值来自lprc结构。您可能需要查看该API以获取更多详细信息。

答案 3 :(得分:0)

我想你可以删除使其下划线的样式。 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;

不是最漂亮的解决方案,但我猜它会起作用。