在WPF应用程序中,如果Text
控件的TextBox
属性以编程方式更新,而用户仍然专注于控件(例如,使用TextChanged
或{{1在KeyUp
属性更新后,是否可以维护用户光标的位置?
在正常情况下,如果更新Text
属性,并且用户专注于控件,则只需将光标重置回Text
的开头。
答案 0 :(得分:3)
是的,可以在值更改后维护用户的光标位置。让我们来看看可以使用它的场景。
考虑一个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 = oldIndex - 1;
}
}
关于上述代码示例的一些注释:
CaretIndex
属性是如何收集之前对Text
属性所做的任何更改。通过这种方式,我们可以在更改任何内容之前知道光标的位置。TextBox
的原始值。见#4。Text
属性,之前用户的光标位置已更改。if
语句。当用户键入有效输入时,光标位置本质上将自动前进到下一个空格。但是,如果用户输入了无效字符,oldIndex
将注册光标通常应该进入的下一个空格,正则表达式将删除无效字符,并运行if
语句,并在空格后返回因为删除了无效字符。