代码之家  ›  专栏  ›  技术社区  ›  Mike Hall

LinkLabel需要比TextRenderer更多的空间。MeasureText说

  •  2
  • Mike Hall  · 技术社区  · 15 年前

    如果我给textrender.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 回复  |  直到 15 年前
        1
  •  2
  •   Community Ramakrishna.p    7 年前

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

        2
  •  1
  •   LukeSw    15 年前

    如果A 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 
    
        3
  •  0
  •   Jeff Moser    15 年前

    textrender.measureText是 DrawTextEx 应用程序编程接口。返回的值来自lprc结构。您可能需要查看该API以了解更多详细信息。

        4
  •  0
  •   Patrick angularsen    15 年前

    我想你可以去掉使它成为下划线的样式。 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;
    

    不是最漂亮的解决方案,但我想是可行的。

    推荐文章