gpt4 book ai didi

c# - WPF 文本框,更新文本属性重置光标位置

转载 作者:行者123 更新时间:2023-11-30 20:48:53 24 4
gpt4 key购买 nike

在 WPF 应用程序中,如果 TextBox 控件的 Text 属性以编程方式更新,而用户仍将焦点放在该控件上(例如,使用 TextChangedKeyUp 事件),是否可以在更新 Text 属性后保持用户光标的位置?

在正常情况下,如果更新 Text 属性,并且用户将焦点放在控件上,则光标会简单地重置回 TextBox 的开头。

最佳答案

是的,可以在值更改后保持用户的光标位置。让我们检查一个可以使用它的场景。

考虑一个 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 语句,并向后移动一次空格,因为无效字符已被删除。

关于c# - WPF 文本框,更新文本属性重置光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24128091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com