1

TextChanged イベントでテキスト ボックスから特定の文字を削除しようとする WPF C# プログラムがあります。たとえば、ドル記号を考えてみましょう。これが私が使用するコードです。

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 の後にある場合、カーソルをテキストの最後に移動すると、次のキー ストロークでユーザーが 3 の後ではなく C の後にデータを入力することになります。通常の機能。

このカーソルシフトが発生する理由を知っている人はいますか?

4

4 に答える 4

4

それはあなたの質問に対する答えではありませんが、おそらくあなたの問題の解決策です:

TextBoxの入力制限を定義する方法は?

やり過ぎの場合は、e.Handled = true回避したいすべての文字をPreviewKeyDownKeyboard.ModifiersShiftキーで使用)またはで設定しPreviewTextInputます。

イベントTextBox.CaretIndexでカーソル位置を復元してみてください。TextChanged

それが役に立てば幸い。

于 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の Position the Cursor について詳しく見ることができます

于 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 に答える