(WinRT)如何获取TextBox插入索引?

时间:2015-10-23 23:25:42

标签: c# xaml windows-runtime windows-phone-8.1 winrt-xaml


我在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>

因此,例如当用户将符号插入第3行时,符号在插入符之前插入2个符号;插入符号在第4行之前的3个符号,依此类推。当符号插入第一行时,插入正常工作。

这是我的插入代码:

<!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);


那么如何解决这个问题?我想新的线路都会制造麻烦。

1 个答案:

答案 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;旁边的其他组合没有相似的行为。如果是,您将需要更新上面的代码。