如何将多行文本框中的光标从一行的末尾移动到下一行的开头

本文关键字:一行 移动 开头 文本 光标 | 更新日期: 2023-09-27 18:16:23

我有一个多行文本框,打开了换行,当它到达当前一行的末尾时,我希望它的光标位于下一行的开头。

。-如果一行可以输入8个字符(等宽),我输入这个:

12345678

我希望光标在'1'字符下面(而不是在8之后)。

问题是:我不能使用NewLine作为文本框字符串的一部分。

如何将多行文本框中的光标从一行的末尾移动到下一行的开头

你可以订阅文本框变化时的通知,如果有8个字符添加一个环境。换行到文本。在第一行之后,你必须对文本进行分割,只得到最后一行,但这并不太难。用户总是能够手动将光标移动到行尾,所以您需要添加逻辑来检查该行是否有9个字符,并删除最后一个。

最终解决了我的问题,同时考虑到不使用环境的限制。NewLine是添加一个额外的空间,保存SelectionStart位置,并计算正确的一个不考虑多余的空间(参见另一篇文章如何使换行考虑字符串中的空白作为常规字符?)

这个解决方案适用于一个非常特殊的情况,在这种情况下,我已经创建了我自己的"NewLine"供我们使用,当用户点击Alt+Enter时,相关的空格将被添加到填充一行(然后我需要光标向下移动……)这就是问题!):

private void TextBox_OnPreviewKeyDown(object sender, KeyEventArgs e)
    {
        var tb = sender as TextBox;
        if (Keyboard.Modifiers == ModifierKeys.Alt && Keyboard.IsKeyDown(Key.Enter))
        {
            int origSelectionStart = tb.SelectionStart;
            int paddingSpacesAmountToAdd = WidthInCells - (tb.Text.Substring(0, tb.SelectionStart)).Length%WidthInCells;
            int origPaddingSpacesAmountToAdd = paddingSpacesAmountToAdd;
            // Only if the cursor is in the end of the string - add one extra space that will be removed eventually.
            if (tb.SelectionStart == tb.Text.Length) paddingSpacesAmountToAdd++;
            string newText = tb.Text.Substring(0, tb.SelectionStart) + new String(' ', paddingSpacesAmountToAdd) + tb.Text.Substring(tb.SelectionStart + tb.SelectionLength);
            tb.Text = newText;
            int newSelectionPos = origSelectionStart + origPaddingSpacesAmountToAdd;
            tb.SelectionStart = newSelectionPos;
            e.Handled = true;
        }
        else if (Keyboard.IsKeyDown(Key.Enter))
        {
            //source already updated because of the binding UpdateSourceTrigger=PropertyChanged
            e.Handled = true;
        }
    }

这是不够的(正如我上面提到的-有一个空格问题),所以:

void _textBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        int origCursorLocation = _textBox.SelectionStart;
        // Regular Whitespace can't be wrapped as a regular character, thus - we'll replace it. 
        _textBox.Text.Replace(" ", "'u00A0");
        _textBox.SelectionStart = origCursorLocation;
    }

重要的 -这个解决方案适用于MonoSpace字符,当有一个精确的拟合字体大小的计算。