繁体   English   中英

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

[英]WPF (with C#) TextBox Cursor Position Problem

我有一个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事件中,它都会从文本框文本中删除$字符,但是还会将光标移动到不是我的文本框的BEGINNING所需的功能。

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

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

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

如何定义TextBox输入限制?

如果对您来说e.Handled = true为您要在PreviewKeyDown (使用SHIFT键的Keyboard.Modifiers )或PreviewTextInput避免的所有字符设置e.Handled = true

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

希望能帮助到你。

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

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

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

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

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;
     }

您可以使用文本框的SelectionStart属性。 这些路线可能应该起作用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM