WPF (с C #) Проблема положения курсора TextBox - PullRequest
1 голос
/ 31 августа 2011

У меня есть программа 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, чтонормальная функциональность.

Кто-нибудь имеет представление, почему происходит это смещение курсора?

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Это не ответ на ваш вопрос, но, вероятно, решение вашей проблемы:

Как определить ограничения ввода TextBox?

Если это для вас излишнеустановите e.Handled = true для всех символов, которые вы хотите избежать, в PreviewKeyDown (используйте Keyboard.Modifiers для клавиши SHIFT) или PreviewTextInput.

Попробуйте TextBox.CaretIndex для восстановления позиции курсора в событии TextChanged.

Надеюсь, это поможет.

3 голосов
/ 31 августа 2011

Вы можете использовать функцию Выбор в TextBox для изменения положения курсора.

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

Подробнее о позиции курсора можно узнать на MSDN

0 голосов
/ 31 августа 2011

Вы можете использовать свойство SelectionStart текстового поля.Возможно, что-то в этом роде должно работать:

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