【发布时间】:2020-01-05 23:23:45
【问题描述】:
我希望它使用 DrawString 和 for(;;) 循环将给定的一段文本正确地显示为一个段落(需要时跳转到新行),但结果很糟糕。
private void pnlText_Paint(object sender, PaintEventArgs e)
{
pnlText.Font = new Font("Calibri", 14, FontStyle.Regular);
SizeF lineSize = new SizeF();
for (int i = 0; i < DisplayText.Length; i++)
{
currentLine += DisplayText[i];
lineSize = e.Graphics.MeasureString(currentLine, pnlText.Font);
if (DisplayText[i].ToString() == " " && lineSize.Width >= 820)
{
paragraph += currentLine + "\n";
currentLine = null;
}
}
using (SolidBrush br = new SolidBrush(Color.Black))
{
e.Graphics.DrawString(paragraph, pnlText.Font, br, 5, 5);
}
}
输出: one sentencewhole paragraph
我傻了,这样重复是没有意义的。 我尝试使用 String Builder 并将 DisplayText.Length 替换为数字,但它仍然无法正常工作。使用 foreach 并分别绘制每个字符可以工作,尽管会弄乱间距。
此外,最初我没有“段落”字符串,我只是在循环内绘制了每一行,但这不知何故导致文本的结尾被切断并在开头粘贴,这更加疯狂。我开始怀疑我的电脑被恶魔附身了。
【问题讨论】:
-
在此方法的开头重置 currentLine 和段落
-
它有助于整理。在循环之前将两者都设置为 null 会导致字符串被绘制一次,但它会切断最后五个字符。仅将段落设置为 null 以某种方式将文本前面的最后 4 个字符移动,并且不显示底部的 7 个附加字符。
-
循环后,将最新的currentLine添加到段落中
-
天哪,谢谢。作品。有趣的是,我必须在循环之前将 currentLine 和段落设为 null,即使我之前已将它们声明为 null。
-
声明为 null 仅适用于您的方法的第一次调用,之后它们包含最新值