2013-03-08 46 views
4

我在我的Windows Store Apps之一中使用简单的多行TextBox,我想使用tab来缩进文本。WinRT XAML Textbox,SelectionStart和CR/LF

由于WinRT在TextBox上没有XAML AcceptsTab属性,所以我觉得当我检测到Tab键时,我必须手动处理它。

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

我现在唯一的想法就是通过解析文本并添加1到SelectionStart每个\r\n OCCURENCES我插入符之前看到的正常化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被reseted为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; 
} 

它的作品,但是......我重新发明了那个圆形的东西吗?是否有一个更清洁的方式做到这一点?

+0

这些问题即使是旧的,你应该验证答案回答你有或没有需要为未来的用户看到并采取这个问题了解答名单。 – micbobo 2015-05-11 12:47:27

回答

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键通常在应用程序