WPF (c#)文本框光标位置问题

本文关键字:光标 位置 问题 文本 WPF | 更新日期: 2023-09-27 18:07:10

我有一个WPF c#程序,我试图在TextChanged事件中从文本框中删除某些字符。比如说,美元符号。下面是我使用的代码:

private void txtData_TextChanged(object sender, TextChangedEventArgs e)
{
      string data = txtData.Text;
      foreach( char c in txtData.Text.ToCharArray() )
      {
            if( c.ToString() == "$" )
            {
                  data = data.Replace( c.ToString(), "" );
            }
      }
      txtData.Text = data;
}

我遇到的问题是,每当用户输入$符号(Shift + 4)时,在TextChanged事件中,它会从文本框文本中删除$字符,但它也会将光标移动到文本框的开始,这不是我想要的功能。

作为一种变通方法,我想到将光标移动到文本框中文本的末尾,但问题是,如果光标位于某个中间位置,那么它将不是非常用户友好。例如,文本框中的文本是123ABC,如果我将光标放在3之后,那么将光标移动到文本的末尾将意味着在下一次按键时,用户将在C之后输入数据,而不是在3之后,这是正常的功能。

有人知道为什么会发生光标移动吗?

WPF (c#)文本框光标位置问题

这不是你问题的答案,但可能是你问题的解决方案:

如何定义文本框的输入限制?

如果对您来说太过分了,请将e.Handled = true设置为您想要避免在PreviewKeyDown中使用的所有字符(使用Keyboard.Modifiers作为SHIFT键)或PreviewTextInput

尝试TextBox.CaretIndexTextChanged事件中恢复光标位置。

希望能有所帮助。

您可以使用TextBox的Select功能来更改光标的位置。

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    textBox1.Text = textBox1.Text.Replace("$", "");            
    textBox1.Select(textBox1.Text.Length, 0);
}

你可以在MSDN

上看到更多关于光标定位的信息

可以使用文本框的SelectionStart属性。下面的代码应该可以工作:

private void txtData_TextChanged(object sender, TextChangedEventArgs e)
{
  var pos = txtData.SelectionStart;
  string data = txtData.Text.Replace("$", "");
  txtData.Text = data;
  txtData.SelectionStart = pos;
}

您可以尝试正则表达式示例

1)在.xaml文件中使用PreviewTextInput="CursorIssueHandler"

在你的。cs文件中,写如下代码:
    private void CursorIssueHandler(object sender, TextCompositionEventArgs e)
    {
        var TB = (sender as TextBox);
        Regex regex = new Regex("[^0-9a-zA-Z-]+");
        bool Valid = regex.IsMatch(e.Text);
        //System.Diagnostics.Debug.WriteLine(Valid); // check value for valid n assign e.Handled accordingly your requirement from regex
        e.Handled = Valid;
     }