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'? –