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 更多的空间说的主要内容,如果未能解决你的问题,请参考以下文章

给LinkLabel文本绘制颜色

如何禁用 LinkLabel TabStop?

LinkLabel... 在默认网络浏览器中打开?

C# 重写LinkLabel控件的click事件

winform中linklabel打开指定网站

对 LinkLabel 控件使用键盘快捷键