4

我在其中一个中使用了一个简单的多行TextBoxWindows Store Apps我希望能够使用tab来缩进文本。

由于 WinRT 上没有 XAMLAcceptsTab属性,TextBox我想当我检测到 Tab 击键时,我必须手动处理它。

问题是:\r\n似乎由 SelectionStart 属性作为一个字符而不是两个字符来处理,我没有得到真正的char位置。

我现在唯一的想法是SelectionStart通过解析文本并为我在插入符号之前看到SelectionStart的每个事件添加 1 来规范化 。\r\n

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;
}

它有效,但是……我又重新发明了那个圆形的东西吗?有没有更清洁的方法来做到这一点?

4

1 回答 1

0

似乎您必须执行“Ctrl + Tab”才能在文本框中实际插入选项卡。因此,您所要做的就是这样

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

^代表CTRL键和你的TABtab键。使用此组合,您可以在应用程序中正常使用 Tab

于 2015-04-27T18:06:33.177 回答