WinRT XAML文本框,选择起始位置和CR/LF

4
我在我的一个Windows Store应用程序中使用了一个简单的多行TextBox,并希望启用使用tab键缩进文本的功能。由于WinRT没有TextBox的XAML AcceptsTab属性,因此我想当检测到Tab按键时手动处理它。
问题是: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;
}

它可以工作,但是...我是否又重新发明了那个圆形的东西?有没有更简洁的方法来做到这一点?


即使这个问题很老,您也应该验证答案是否满足您的需求,以便未来用户可以查看并将该问题从未回答列表中移除。 - micbobo
1个回答

0

看起来你需要执行“Ctrl + Tab”才能在文本框中插入制表符。因此,你只需要像这样做:

TextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
      if (e.KeyCode == Keys.Tab)
      {
          e.Handled = true;
          SendKeys(^{TAB});
      }
}

^ 代表 CTRL 键,TAB 代表 Tab 键。使用这个组合键,您可以在应用程序中正常使用 Tab 键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接