我在我的一个Windows Store应用程序中使用了一个简单的多行TextBox,并希望启用使用tab键缩进文本的功能。由于WinRT没有TextBox的XAML AcceptsTab属性,因此我想当检测到Tab按键时手动处理它。
问题是:SelectionStart属性似乎将\r\n视为一个字符而不是两个字符,因此我无法获取真正的char位置。
我现在唯一的想法是通过解析文本并在插入符号之前看到每个\r\n出现次数来规范化SelectionStart。
问题是:SelectionStart属性似乎将\r\n视为一个字符而不是两个字符,因此我无法获取真正的char位置。
我现在唯一的想法是通过解析文本并在插入符号之前看到每个\r\n出现次数来规范化SelectionStart。
public static class TextBoxExtension
{
public static int GetNormalizedSelectionStart(this TextBox textBox)
{
int occurences = 0;
string source = textBox.Text;
for (var index = 0; index < textBox.SelectionStart + occurences ; index++)
{
if (source[index] == '\r' && source[index + 1] == '\n')
occurences++;
}
return textBox.SelectionStart + occurences;
}
}
最后,在操作完成后,SelectionStart
将被重置为0,因此我需要使用非规范化的位置将其设置回正确的位置。以下是调用者:
if (e.Key == VirtualKey.Tab)
{
int cursorIndex = MainTextBox.SelectionStart;
int cursorIndexNormalized = MainTextBox.GetNormalizedSelectionStart();
MainTextBox.Text = MainTextBox.Text.Insert(cursorIndexNormalized, "\t");
MainTextBox.SelectionStart = cursorIndex + 1;
e.Handled = true;
}
它可以工作,但是...我是否又重新发明了那个圆形的东西?有没有更简洁的方法来做到这一点?