簡體   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