2014-06-09 196 views
2

在WPF應用程序中,如果一個TextBox控制的Text屬性編程方式更新,而用戶仍然集中在控制(比如,用TextChangedKeyUp事件),是在Text屬性更新後可以保持用戶光標的位置?WPF文本框,更新文字屬性重置光標位置

在正常情況下,如果Text屬性已更新,並且用戶已將注意力集中在控件上,則光標將被簡單地重置回TextBox的開頭。

回答

2

是的,可以在值更改後保持用戶的光標位置。讓我們來看看可以使用這種情況的場景。

考慮一個TextBox控件,您只希望用戶輸入字母數字值並刪除所有其他字符。

我們可能有一些XAML看起來像這樣:

<TextBox x:Name="myInput" Margin="72,95,0,0" TextChanged="clearInputHandler" /> 

...和C#處理程序,如:

private void clearInputHandler(object sender, TextChangedEventArgs e) { 
    string validInput = Regex.Replace(myInput.Text, "[^A-Za-z0-9]", ""); 
    myInput.Text = validInput; 
} 

然而,這從問題光標所在位置將受到影響如果Text屬性已更新,則將其設置爲輸入的開頭。

要解決此問題,使用CaretIndex屬性,它抓住了用戶的光標的位置:

private void clearInputHandler(object sender, TextChangedEventArgs e) { 
    int oldIndex = myInput.CaretIndex; 
    string oldValue = myInput.Text; 
    string validInput = Regex.Replace(myInput.Text, "[^A-Za-z0-9]", ""); 
    myInput.Text = validInput; 

    if(!oldValue.Equals(validInput)) { 
     myInput.CaretIndex = index - 1; 
    } 
} 

在上面的代碼示例的幾個注意事項:

  1. 注意如何CaretIndex財產在之前收集Text屬性進行任何更改。這樣我們知道光標在什麼地方被改變之前的位置。
  2. 保存TextBox的原始值。見#4。
  3. Text屬性再次被設置,之前用戶的光標位置被改變。
  4. 底部的if語句只有在正則表達式更改給定的文本時纔會運行。當用戶鍵入有效輸入時,遊標位置自然會自動前進到下一個空格。但是,如果用戶輸入了無效字符,則oldIndex將註冊光標通常應該移到的下一個空格,正則表達式會刪除無效字符,並且會運行if語句,並且由於無效字符被移除而移回一次空格。
+0

'index'定義在哪裏?你的意思是把'oldIndex'? –

相關問題