您好 我在调整文本长度方面遇到问题,因此它符合表单的长度。 在我的表格中,我放置了一个标签,负责显示一些长文本。然而,文本可能太长,以至于它不适合形式。这就是为什么我想缩短这个文本并将...添加到最后。
问题是我不知道如何有效地计算最适合形式的最大长度的子串。到目前为止,我只设法检查给定的文本是否太长(我使用MeasureString
类中的方法Graphics
)。
计算适合形式的子子串的最佳方法是什么(子串width < form.Width
)?
答案 0 :(得分:1)
我所知道的只有可靠的方法是缩短你的字符串直到它适合你可以使用MeasureString()
检查,不幸的是没有反向方法(给定宽度,这个字符串适合多少),所以你将不得不自己建立。
答案 1 :(得分:1)
我解决了这个问题,因为我今天遇到了这个问题。我的ToolStripStatusLabel设置为自动调整大小,但它超出了父控件的宽度,从而隐藏了自身。我的解决方案专门用于ToolStripStatusLabel控件。由于这种情况,此控件不提供MaxWidth属性或AutoEllipsis属性。它也不会为我生成Graphics对象,因为它不是控件系列的一部分。可以更改此方法以使用两个Control对象,除参数外没有太多更改。我的选择非常有限,所以我捏造了这种方法:
/// <summary>
/// If a child ToolStripStatusLabel is wider than it's parent then this method will attempt to
/// make the child's text fit inside of the parent's boundaries. An ellipsis can be appended
/// at the end of the text to indicate that it has been truncated to fit.
/// </summary>
/// <param name="child">Child ToolStripStatusLabel</param>
/// <param name="parent">Parent control where the ToolStripStatusLabel resides</param>
/// <param name="appendEllipsis">Append an "..." to the end of the truncated text</param>
public static void TruncateChildTextAccordingToControlWidth(ToolStripStatusLabel child, Control parent, bool appendEllipsis)
{
//If the child's width is greater than that of the parent's
if(child.Size.Width > parent.Size.Width)
{
//Get the number of times that the child is oversized [child/parent]
decimal decOverSized = (decimal)(child.Size.Width) / (decimal)(parent.Size.Width);
//Get the new Text length based on the number of times that the child's width is oversized.
int intNewLength = (int)(child.Text.Length / (2M * decOverSized)); //Doubling as a buffer (Magic Number).
//If the ellipsis is to be appended
if(appendEllipsis) //then 3 more characters need to be removed to make room for it.
intNewLength = intNewLength - 3;
//If the new length is negative for whatever reason
if(intNewLength < 0)
intNewLength = 0; //Then default it to zero
//Truncate the child's Text accordingly
child.Text = child.Text.Substring(0, intNewLength);
//If the ellipsis is to be appended
if(appendEllipsis) //Then do this last
child.Text += "...";
}
}
我将是第一个指出我做了一个可怕的事情,包括一个神奇的数字!我道歉,但2M是一个缓冲区。我找不到更好的方法,当我/如果我找到一种方法,我一定会回来并在这里更新它。我需要神奇的数字,因为我计算的百分比是准确的,但是为了使父控件内的子控件足够好,我需要大约两倍的返回值。
我确信这不会完全准确,具体取决于标签字体大小和其他因素,但它是一个起点。
答案 2 :(得分:1)
我使用此代码通过从字符串的开头剥离字符来使我的状态栏文本适合。也许你可以根据自己的需要进行修改
status.Text = status.Text + " | " + newText;
while (TextRenderer.MeasureText(status.Text, status.Font).Width > status.Width)
status.Text = status.Text.Substring(1);
答案 3 :(得分:0)
您可以逐字编写文本,同时将光标点向前移动,直到到达行尾(表单的宽度)。我有一个类似的问题,但我在表单上绘制文本,我更改了我的代码以满足您的需要。
private bool WriteWord(string word)
{
Size size = TextRenderer.MeasureText(word + " ", Font);
if (cursor.X + size.Width > Width)
{
// you reached the end of the line
return false;
}
label1.Text += word + " "; // add the word to label.
cursor.X += size.Width;
return true;
}
Point Cursor;
private string FindMaxSubstring(string text)
{
string[] tokens = text.Split(new string[] { " "});
string substring ="";
Cursor.X = 0;
foreach (var t in tokens)
{
if (!string.IsNullOrEmpty(t.Trim()))
{
if (!WriteWord(t))
return substring;
substring += t;
}
}
}
答案 4 :(得分:0)
将标签的AutoSize
属性设置为true,然后将文本拆分为标记,并通过标记将标记添加到label.Text
,直到label.Width > Width.