LinkLabel 需要比 TextRenderer.MeasureText 更多的空间说
Posted
技术标签:
【中文标题】LinkLabel 需要比 TextRenderer.MeasureText 更多的空间说【英文标题】:LinkLabel needing more space than TextRenderer.MeasureText says 【发布时间】:2009-06-04 19:12:03 【问题描述】:如果我给 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 将绘制文本,字符之间的间距似乎更大,有时这会导致文本的结尾被剪裁。有没有办法防止这种情况发生?我尝试在有链接时添加填充,但没有可靠的方法来确切知道需要多少空间。有没有其他方法可以做到这一点?
【问题讨论】:
【参考方案1】:您应该使用Control.GetPreferredSize 方法来计算控件所需的宽度或高度(在您的情况下为LinkLabel)。您不应该将MeasureText用于此类目的,更详细的说明您可以找到here (Accuracy of TextRenderer.MeasureText results.)
【讨论】:
【参考方案2】:如果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
【讨论】:
否,DrawString 仅在 UseCompatibleTextRendering 开启时使用。 对不起,你说的不对。亲自查看并使用以下代码:linkLabel1.Text = new string('l', 100); // 100 x 小 L linkLabel1.LinkArea = new LinkArea(0, 50); linkLabel2.Text = new string('l', 100); // 100 x 小 L 在测试常规标签和 LinkLabels 时,您的建议在我的测试应用程序中有效,但在我的实际应用程序中,Control.GetPreferredSize 方法是唯一有效的方法。【参考方案3】:TextRenderer.MeasureText 是DrawTextEx API 的托管包装器。返回的值来自 lprc 结构。您可能想查看该 API 以了解更多详细信息。
【讨论】:
如果修复涉及获得正确的测量值,然后仍然使用 LinkLabel 控件,似乎需要通过 MeasureText 或 DrawTextEx 知道文本将显示为链接,但两者都没有有类似的东西。正如我在问题中所说,如果文本仅显示为纯文本,则 MeasureText 可以正常工作。 您是否在 LinkLabel 上启用了 AutoSize?【参考方案4】:我想你可以删除使它成为下划线的样式。 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;
不是最漂亮的解决方案,但我想它会起作用。
【讨论】:
以上是关于LinkLabel 需要比 TextRenderer.MeasureText 更多的空间说的主要内容,如果未能解决你的问题,请参考以下文章