2
在WPF應用程序中,如果一個TextBox
控制的Text
屬性編程方式更新,而用戶仍然集中在控制(比如,用TextChanged
或KeyUp
事件),是在Text
屬性更新後可以保持用戶光標的位置?WPF文本框,更新文字屬性重置光標位置
在正常情況下,如果Text
屬性已更新,並且用戶已將注意力集中在控件上,則光標將被簡單地重置回TextBox
的開頭。
在WPF應用程序中,如果一個TextBox
控制的Text
屬性編程方式更新,而用戶仍然集中在控制(比如,用TextChanged
或KeyUp
事件),是在Text
屬性更新後可以保持用戶光標的位置?WPF文本框,更新文字屬性重置光標位置
在正常情況下,如果Text
屬性已更新,並且用戶已將注意力集中在控件上,則光標將被簡單地重置回TextBox
的開頭。
是的,可以在值更改後保持用戶的光標位置。讓我們來看看可以使用這種情況的場景。
考慮一個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;
}
}
在上面的代碼示例的幾個注意事項:
CaretIndex
財產在之前收集對Text
屬性進行任何更改。這樣我們知道光標在什麼地方被改變之前的位置。TextBox
的原始值。見#4。Text
屬性再次被設置,之前用戶的光標位置被改變。if
語句只有在正則表達式更改給定的文本時纔會運行。當用戶鍵入有效輸入時,遊標位置自然會自動前進到下一個空格。但是,如果用戶輸入了無效字符,則oldIndex
將註冊光標通常應該移到的下一個空格,正則表達式會刪除無效字符,並且會運行if
語句,並且由於無效字符被移除而移回一次空格。
'index'定義在哪裏?你的意思是把'oldIndex'? –