我在Windows Store App(WP 8.1)中获取TextBox的插入索引时遇到了一些问题。
当按下按钮时,我需要在文本中插入特定符号。
我试过了:
text.Text = text.Text.Insert(text.SelectionStart, "~");
但是这段代码将符号插入到文本的开头,而不是插入符号的位置。
我感谢Ladi更新了我的代码。但现在我遇到了另一个问题:我正在构建HMTL编辑器应用程序,所以我的默认TextBlock.Text是:
<!DOCTYPE html>\r\n<html>\r\n<head>\r\n</head>\r\n<body>\r\n</body>\r\n</html>
<!DOCTYPE html>\r\n<html>\r\n<head>\r\n</head>\r\n<body>\r\n</body>\r\n</html>
Index = HTMLBox.SelectionStart;
HTMLBox.Text = HTMLBox.Text.Insert(Index, (sender as AppBarButton).Label);
HTMLBox.Focus(Windows.UI.Xaml.FocusState.Keyboard);
那么如何解决这个问题?我想新的线路都会制造麻烦。
答案 0 :(得分:2)
对于您的第一个问题,我假设您在访问TextBox.Text
之前更改了SelectionStart
。设置text.Text
后,text.SelectionStart
将重置为0.
关于与新线路相关的第二个问题。
你可以说你观察到的是设计。 SelectionStart
将计算一个&#34; \ r \ n&#34;作为一个字符解释here的原因(参见备注部分)。另一方面,方法string.Insert
并不关心这个方面,而是计算&#34; \ r \ n&#34;作为两个字符。
您需要略微更改代码。您不能使用SelectionStart
的值作为插入位置。您需要计算SelectionStart
的此行为的插入位置。
这是一个带有潜在解决方案的详细代码示例。
// normalizedText will allow you to separate the text before
// the caret even without knowing how many new line characters you have.
string normalizedText = text.Text.Replace("\r\n", "\n");
string textBeforeCaret = normalizedText.Substring(0, text.SelectionStart);
// Now that you have the text before the caret you can count the new lines.
// that need to be accounted for.
int newLineCount = textBeforeCaret.Count(c => c == '\n');
// Knowing the new lines you can calculate the insert position.
int insertPosition = text.SelectionStart + newLineCount;
text.Text = text.Text.Insert(insertPosition, "~");
此外,您应该确保SelectionStart与&#34; \ r \ n&#34;旁边的其他组合没有相似的行为。如果是,您将需要更新上面的代码。