是的,当值改变时,保持用户光标位置是可能的。让我们看一个可以使用此功能的场景。
考虑一个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;
}
}
对上面代码示例的一些说明:
- 注意在对
Text
属性做任何更改之前,如何先获取CaretIndex
属性。这样我们就知道在进行任何更改之前光标所在的位置。
- 保存了
TextBox
的原始值。参见#4。
- 再次设置
Text
属性,在更改用户光标位置之前。
- 底部的
if
语句仅在正则表达式更改其接收的文本时才运行。由于用户输入有效内容时,光标位置自然会自动前进到下一个空格。但是,如果用户输入了无效字符,则oldIndex
记录了光标应该正常前往的下一个空格,正则表达式会删除无效字符,然后运行if
语句,并向后移动一个空格,因为无效字符已被删除。
index
定义在哪里?你是不是想放oldIndex
? - Casey Hancock