1

我有一个 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 之后正常功能。

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

4

4 回答 4

4

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

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

如果这对您来说太过分了,请e.Handled = truePreviewKeyDownKeyboard.Modifiers用于 SHIFT 键)或PreviewTextInput.

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

希望能帮助到你。

于 2011-09-01T16:00:44.800 回答
3

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

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

您可以在MSDN上查看有关定位光标的更多信息

于 2011-08-31T05:47:47.250 回答
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;
}
于 2011-08-31T00:47:08.133 回答
0

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

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

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;
     }
于 2019-09-19T06:08:40.760 回答