【问题标题】:How do I make a label control truncate long strings with an ellipsis?如何使标签控件用省略号截断长字符串?
【发布时间】:2023-03-09 05:27:01
【问题描述】:

我有一个带有可变文本的标签,我希望它是固定长度的单行。每当文本长于标签长度时,我希望它在末尾显示适合“...”的任何内容。例如:

Some Very Long Text

看起来像:

Some Very Lon...

有人知道怎么做吗?

【问题讨论】:

    标签: .net winforms label


    【解决方案1】:

    其中一个选项是将Label.AutoEllipsis 设置为true。

    将 AutoEllipsis 设置为 true 以在用户使用鼠标经过控件时显示超出标签宽度的文本。如果 AutoSize 为 true,则标签将增大以适合文本,并且不会出现省略号。

    因此,您需要将 AutoSize 设置为 false。省略号的外观取决于标签的固定宽度。 AFAIK,您需要手动处理文本更改以使其取决于文本长度。

    【讨论】:

    • 实际上,将 autosize 设置为 true 的标签如果其增长受到其容器的限制(例如:tableLayoutPanel 单元格中的标签),则会显示省略号
    【解决方案2】:

    我的解决方案:

        myLabel.text = Trim(someText, myLabel.Font, myLabel.MaximumSize.Width);
    
    public static string Trim(string text, System.Drawing.Font font, int maxSizeInPixels)
    {
        var trimmedText = text;
        var graphics = (new System.Windows.Forms.Label()).CreateGraphics();
        var currentSize = Convert.ToInt32(graphics.MeasureString(trimmedText, font).Width);
        var ratio = Convert.ToDouble(maxSizeInPixels) / currentSize;
        while (ratio < 1.0)
        {
            trimmedText = String.Concat(
               trimmedText.Substring(0, Convert.ToInt32(trimmedText.Length * ratio) - 3), 
               "...");
            currentSize = Convert.ToInt32(graphics.MeasureString(trimmedText, font).Width);
            ratio = Convert.ToDouble(maxSizeInPixels) / currentSize;
        }
        return trimmedText;
    }
    

    【讨论】:

    • 这个方法非常适合为我的 ToolStripLabel 添加一个 AutoEllipsis 类型的方法,它默认没有 AutoEllipsis 函数。
    • 如果你使用这个要小心......子字符串会因为 -3 而爆炸。取决于字体大小和 maxSizeInPixels,比率将收敛于 1.0 以下(并永远循环)。图形是一次性的。确保您使用的组件不能自行自动省略。