WPF TextBox,更新文本属性重置光标位置

时间:2014-06-09 20:05:57

标签: c# wpf

在WPF应用程序中,如果Text控件的TextBox属性以编程方式更新,而用户仍然专注于控件(例如,使用TextChanged或{{1在KeyUp属性更新后,是否可以维护用户光标的位置?

在正常情况下,如果更新Text属性,并且用户专注于控件,则只需将光标重置回Text的开头。

1 个答案:

答案 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;
    }
}

关于上述代码示例的一些注释:

  1. 注意CaretIndex属性是如何收集之前Text属性所做的任何更改。通过这种方式,我们可以在更改任何内容之前知道光标的位置。
  2. 保存TextBox的原始值。见#4。
  3. 再次设置Text属性,之前用户的光标位置已更改。
  4. 仅当正则表达式更改其给定的文本时,才会运行底部的if语句。当用户键入有效输入时,光标位置本质上将自动前进到下一个空格。但是,如果用户输入了无效字符,oldIndex将注册光标通常应该进入的下一个空格,正则表达式将删除无效字符,并运行if语句,并在空格后返回因为删除了无效字符。