2013-03-08 47 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鍵通常在應用程序