C#: 多行文本框(Multiline TextBox)与自动换行(TextBox.WordWrap)显示长的Base64字符串

9
我有一个文本框,需要展示一个非常长的Base64字符串。我已经设置了TextBox.Multline = trueTextBox.WordWrap = true
然而问题是由于文本框自动检测单词边界导致的。Base64编码中有64个字符之一是'+', 因此文本框会在'+'处自动换行,这不是我想要的(因为用户可能会认为'+'字符周围有一个换行符)。
我只想让我的Base64字符串在文本框的多行模式下显示,但不希望出现单词边界的检测。也就是说,如果TextBox.Width只能容纳80个字符,则每行应该恰好有80个字符,除了最后一行外。
1个回答

2

智能换行对您的目的来说太聪明了。只需保留Multiline,关闭WordWrap并自己换行即可:

public IEnumerable<string> SimpleWrap(string line, int length)
{
    var s = line;
    while (s.Length > length)
    {
        var result = s.Substring(0, length);
        s = s.Substring(length);
        yield return result;
    }
    yield return s;
}

更新:

使用等宽字体时,TextBox 中可容纳的字符数估计为:

public int GetMaxChars(TextBox tb)
{
    using (var g = CreateGraphics())
    {
        return (int)Math.Floor(tb.Width / (g.MeasureString("0123456789", tb.Font).Width / 10));
    }
}

变宽字体较为困难,但可以使用 MeasureCharacterRanges 来实现。


你如何确定长度?不要假设固定宽度字体。 - SLaks
1
最好使用TextRenderer.MeasureText。 - SLaks
原帖者暗示他正在使用等宽字体。如果他使用的是变宽字体,则手动换行不是很好的解决方案,但仍然可行。 - Rick Sladkey
@SLaks,你能不能让它更容易理解一些或者给我一些示例代码?谢谢。新年快乐! - Peter Lee
那么你如何将IEnumerable字符串转换为字符串呢?我在我的文本框中有几行文本,只想包装其中的一些。所以这个代码不起作用:textBox1.Text += SimpleWrap("my long text", GetMaxChars(textBox1)); - fishmong3r
我开始按照这些做,结果陷入了困境;例如,如果用户复制文本(包括换行符),该怎么办?如果用户编辑文本(需要管理光标),又该怎么办?等等。我只希望能够关闭所谓的“智能换行”。 - SteveCinq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接