WPF文本框及空格字符换行

9

我的观察:

在测试一个启用了换行的WPF应用程序中的TextBox,以允许多行文本,如果我只是开始打字,并且达到了TextBox的最右边,单词和光标将基于我输入中的最后一个空格/字符断点换到下一行。

如果在第一行上我键入一个单一的字符,然后按住空格键,光标会从TextBox中滚动出视图,并且当光标达到第一行的末尾时不会换行到第二行。一旦我键入一个非空格字符,该字符就会换行并从第二行的开头开始。如果我使用左箭头键向后移动,光标将从第二行消失,并且在一段时间内在第一行上不可见,直到它通过先前键入的所有空格移动。 如果我将光标放在第一行的末尾并键入另一个非空格字符,则该字符通常会包裹到第二行,并在第二行的前面有几个空格。相对于TextBox中的文本,内容将包括所有可见字符以及包含在TextBox视图区域之外的所有空格字符。

我的问题:

是否有一个属性设置在TextBox上,可强制要求空格字符在达到第一行的末尾时换行到第二行,而不是滚动屏幕并消失在视图外?

谢谢。

马克


1
你使用 Wrap 还是 WrapWithOverflow - thumbmunkeys
我尝试过两种方式,但结果相同。 - Mark Parr
1
不确定问题可能是什么,但似乎空格被解释为一个无法换行的单词,请参考此链接:http://stackoverflow.com/questions/13161966/wpf-textwrapping-on-white-spaces - thumbmunkeys
@MarkParr,你真的需要允许用户输入那么多空格吗?你可以拦截按键,自定义格式化文本,这样他就不会这样做了。 - Lupu Silviu
没有 - 但是用户有时会做一些愚蠢的事情。 - Mark Parr
显示剩余3条评论
1个回答

1

经过一些研究,将文本中的空格“ ”替换为不间断空格“/u00a0”可以使光标保持在文本框范围内。

我只是将其作为概念验证进行了连接,这将导致递归调用,因此不要在生产代码中使用此方法。也许可以使用转换器,或者在数据绑定属性设置器中使用?

    /// <summary>
    ///     Handle textbox on text changed event
    /// </summary>
    private void TextBoxBase_OnTextChanged(object sender, TextChangedEventArgs e)
    {
        // Replace space with non-breaking space
        TestTextBox.Text = TestTextBox.Text.Replace(" ", "\u00a0");
        // Put the cursor at the end of the textbox (updating text sets the cursor at the start)
        TestTextBox.CaretIndex = TestTextBox.Text.Length;
    }

这种方法可以防止“溢出”问题,但它也会破坏单词换行,因为RichTextBox将内容处理为一个长单词而不是由空格分隔的多个单词,所以这并不是一个可行的解决方案。 - WarpedBoard
@WarpedBoard确认这将无法与WPF RichTextbox一起使用,按下空格键的行为类似于换行符。尝试了几种不同的UTF / ASCI代码, 等,但无法在RichTextbox上使相同的技巧起作用。 - robaudas

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