テキストを変更するラベルがあり、固定長の 1 行にしたいと考えています。テキストがラベルの長さよりも長い場合は常に、最後に「...」に収まるものを表示したいと考えています。例えば:
Some Very Long Text
次のようになります。
Some Very Lon...
誰もそれを行う方法を知っていますか?
オプションの1つは、Label.AutoEllipsisをtrueに設定することです。
AutoEllipsisをtrueに設定すると、ユーザーがマウスでコントロールを通過したときにラベルの幅を超えるテキストが表示されます。AutoSizeがtrueの場合、ラベルはテキストに合わせて拡大され、省略記号は表示されません。
AutoSize
したがって、 falseに設定する必要があります。省略記号の外観は、ラベルの固定幅によって異なります。AFAIK、テキストの長さに依存するようにテキストの変更を手動で処理する必要があります。
私の解決策:
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;
}