如何将多行文本框中的光标从一行的末尾移动到下一行的开头
本文关键字:一行 移动 开头 文本 光标 | 更新日期: 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字符,当有一个精确的拟合字体大小的计算。