WPF(带C#)TextBox光标位置问题

时间:2011-08-31 00:39:14

标签: c# wpf textbox cursor-position

我有一个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;
}

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

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

有人知道为什么会发生这种光标偏移吗?

4 个答案:

答案 0 :(得分:4)

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

How to define TextBox input restrictions?

如果您的内容过大,请在e.Handled = true({SHAP密钥使用PreviewKeyDown)或Keyboard.Modifiers中为要避免的所有字符设置PreviewTextInput

尝试TextBox.CaretIndex恢复TextChanged事件中的光标位置。

希望它有所帮助。

答案 1 :(得分:3)

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

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

您可以在MSDN

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

答案 2 :(得分:0)

您可以使用文本框的SelectionStart属性。沿着这些方面可能会有所作为:

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

答案 3 :(得分:0)

您可以尝试使用正则表达式 样本

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

2)在您的.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;
     }