【问题标题】:AutoSize text in a fixed-sized label to avoid text jumping to second lineAutoSize 文本在固定大小的标签中,以避免文本跳转到第二行
【发布时间】:2013-04-17 21:01:01
【问题描述】:

我有一个固定大小的标签,大约 100 像素宽和 20 像素高。

当我在标签中放置一个长字符串时,文本会换行到第二行,但我看不到第二行,因为标签的大小是固定的。

我希望缩小字体大小以使字符串显示在标签中的单行上,而不是换行到第二行。有谁知道一个简单的方法来做到这一点?

编辑:

下面的代码对我有用(大部分时间)。我不想做任何递归的事情。有时文本仍然溢出到另一行。我假设是因为我不能真正使用标签的整个宽度。我该如何弥补?

private void Label_TextChanged(object sender, EventArgs e)
{
    Label label = sender as Label;

    if (label != null && label.Text.Length != 0)
    {
        SizeF size = new SizeF();
        using (Graphics g = label.CreateGraphics())
        {
            size = g.MeasureString(label.Text, label.Font);
        }

        Single x = (label.Width) / size.Width;
        Single y = (label.Height) / size.Height;
        Single scaler = x > y ? y : x;

        using (Font font = label.Font)
        {
            label.Font = new Font(font.Name, font.SizeInPoints * scaler);
        }
    }
}

【问题讨论】:

  • 像这样改变字体大小并不能真正奏效。对于大多数字体,Windows 不能只创建任意大小的字符;相反,它会为您提供尽可能接近您要求的量化字体大小。所以有时你会得到比你想要的更大的字体,并且文本会换行。不知道为什么你不想在这里做任何递归的事情,因为它肯定会起作用。性能完全没有问题。

标签: c# string winforms label autosize


【解决方案1】:

这很容易做到。使用Graphics.MeasureString(...)确定你的字符串需要的宽度,然后逐渐让字体越来越小,直到字符串需要的宽度等于或小于你的标签宽度。

【讨论】:

  • Label默认使用TextRenderer,使用Graphics.MeasureString()不正确。
【解决方案2】:

您可以使用System.Windows.Forms.Label.TextChanged-event 并检查字符串的长度。

private void Label_TextChanged(object sender, EventArgs e){
    System.Windows.Forms.Label label = sender as label;
    if(label != null){
       //check text-length and if necessary resize it
    } 
}

请参阅here 了解TextChanged-事件。

FontHeight-property,它可能会成功。参考here

如果一切都失败了,从System.Windows.Forms.Label 派生并创建您自己的自定义标签。

【讨论】:

    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多