2014-06-09 143 views
2

在WPF应用程序中,如果一个TextBox控制的Text属性编程方式更新,而用户仍然集中在控制(比如,用TextChangedKeyUp事件),是在Text属性更新后可以保持用户光标的位置?WPF文本框,更新文字属性重置光标位置

在正常情况下,如果Text属性已更新,并且用户已将注意力集中在控件上,则光标将被简单地重置回TextBox的开头。

回答

2

是的,可以在值更改后保持用户的光标位置。让我们来看看可以使用这种情况的场景。

考虑一个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; 
    } 
} 

在上面的代码示例的几个注意事项:

  1. 注意如何CaretIndex财产在之前收集Text属性进行任何更改。这样我们知道光标在什么地方被改变之前的位置。
  2. 保存TextBox的原始值。见#4。
  3. Text属性再次被设置,之前用户的光标位置被改变。
  4. 底部的if语句只有在正则表达式更改给定的文本时才会运行。当用户键入有效输入时,游标位置自然会自动前进到下一个空格。但是,如果用户输入了无效字符,则oldIndex将注册光标通常应该移到的下一个空格,正则表达式会删除无效字符,并且会运行if语句,并且由于无效字符被移除而移回一次空格。
+0

'index'定义在哪里?你的意思是把'oldIndex'? –

相关问题