3

我正在尝试在 winforms 多行文本框中显示不可打印的字符(空格、换行符),这是大多数文本处理工具中的一项功能。

我这样做是通过

textbox.Text.Replace(' ','·').Replace(Environment.NewLine, "¶" + Environment.NewLine);

到目前为止,这工作正常,但是由于缺少空格,自动换行不再起作用。所以我尝试测量每行的长度以手动添加自动换行,但我没有得到想要的结果:

private int GetTextWidth(TextBox tb)
{
    using (var g = textBox1.CreateGraphics())
    {
        SizeF size = g.MeasureString(tb.Text, tb.Font);
        int width = (int)(size.Width + 0.5);
        return width;
    }
}

GetTextWidth 为不同的字符返回不同的结果。当我键入一行“l”时,GetTextWidth == textbox.Width 将在 ~80% 之后达到,而“M”sa 换行符甚至在 GetTextWidth == textbox.Width 之前发生。

使用等宽字体不是一种选择。

4

2 回答 2

2

你可以尝试使用Zero width space

textbox.Text.Replace(" ","·\u200B")

它仍然应该允许换行,但不会看起来像任何东西。Backspaces/deletes 会出现奇怪的行为,因此您可能需要确认您将要删除一个.表示零宽度空格的字符(反之亦然),并且知道只需按一下键即可删除这两个字符。

于 2012-11-09T15:52:31.457 回答
0

Graphics.MeasureString()方法在设计上是不准确的。有关替代方法,请参阅MSDN 库页面上的备注部分。

于 2012-11-09T15:27:35.470 回答