2

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

4 回答 4

2

您应该使用Control.GetPreferredSize方法来计算控件所需的宽度或高度(在您的情况下为 LinkLabel)。您不应将 MeasureText 用于此类目的,您可以在此处找到更详细的说明(TextRenderer.MeasureText 结果的准确性。)

于 2009-07-29T13:10:45.430 回答
1

如果 aLinkLabel包含多个链接,或者有部分文本不在链接中,则控件使用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 
于 2009-07-29T02:06:10.397 回答
0

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

于 2009-06-05T16:31:08.693 回答
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;

不是最漂亮的解决方案,但我猜它有效。

于 2009-06-05T21:55:15.030 回答