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

5
在WPF应用程序中,如果在用户仍然聚焦于TextBox控件的情况下(例如通过TextChangedKeyUp事件),以编程方式更新了TextBox控件的Text属性,是否可能在Text属性已经被更新后保持用户光标的位置?
通常情况下,如果更新了Text属性并且用户正在聚焦于该控件,则光标会简单地重置回到TextBox的开头。
1个回答

4

是的,当值改变时,保持用户光标位置是可能的。让我们看一个可以使用此功能的场景。

考虑一个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. 注意在对Text属性做任何更改之前,如何先获取CaretIndex属性。这样我们就知道在进行任何更改之前光标所在的位置。
  2. 保存了TextBox的原始值。参见#4。
  3. 再次设置Text属性,更改用户光标位置之前。
  4. 底部的if语句仅在正则表达式更改其接收的文本时才运行。由于用户输入有效内容时,光标位置自然会自动前进到下一个空格。但是,如果用户输入了无效字符,则oldIndex记录了光标应该正常前往的下一个空格,正则表达式会删除无效字符,然后运行if语句,并向后移动一个空格,因为无效字符已被删除。

index 定义在哪里?你是不是想放 oldIndex - Casey Hancock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接