2015-09-19 2 views
1

Предположим, что мы наследуем от WPF TextBox, а затем попытаемся получить текстовые изменения с помощью переопределения OnTextChanged.Как найти измененный текст WPF TextBox?

Тогда мы заметили, когда произошли изменения, но только информация, которую мы бы это:

  • Offset, что это изменение произошло
  • Удалены Длина
  • Добавлено Длина

Может мы получаем точный добавленный текст с использованием,

Text.Substring(Change.Offset, Change.AddedLength) 

в OnTextChanged?

Изменение текста происходит в разных условиях (например, ввод пользователя, вставка текста или установка Text в коде кода). Есть ли какая-либо возможность вступать в противоречивые изменения в e.Changes?

Является ли этот подход доверительным путем? Если ответ «Нет», есть ли какой-либо другой стандартный способ (ы) для получения точного измененного текста?

ответ

0

Для TextBox это событие возникает, когда его текст изменяется; для RichTextBox это событие возникает, когда изменяется какое-либо содержимое или форматирование (например, изображения, таблица или цвет фона).

  1. Можем ли мы получить точный добавленный текст, используя ...?

Да, вы всегда получите точный текст в случае TextBox. Вы можете использовать e.UndoAction для проверки добавления/удаления текста. Прочтите documentation здесь.

  1. Есть ли какая-либо возможность возникновения противоречивых изменений в e.Changes?

Не будет противоречивых изменений.

В общем, следующий будет всегда верно:

  • Изменения, которые происходят в результате документа, находящегося в допустимом состоянии. Коллекция упорядочивается последовательно, связанная с тем, где произошло изменение в элементе управления. Например, объект TextChange, который представляет собой изменение в положении 2 находится перед TextChange объекта, который представляет изменение в позиции 10.

  • Два объекта TextChange не представляет собой область перекрытия.Значение Offset плюс значение AddedLength одного объекта TextChange
    всегда меньше или равно значению смещения
    следующий объект TextChange в коллекции. Аналогично, значение
    Offset плюс значение RemovedLength одного объекта TextChange является
    всегда меньше или равно значению смещения следующего
    объекта TextChange в коллекции.

  • В коллекции отражены любые изменения, произошедшие, даже если нет изменений в сети. В предыдущем примере ни первое, ни четвертое изменение
    не приводит к изменению сети, поскольку каждый просто
    удалены и повторно добавлены и символы соответственно. Но
    символы были фактически удалены и добавлены, поэтому они включены в комплект
    .

Подробнее можно прочитать here.

0

Я сделал короткую тестовую программу с одним TextBox и одним ярлыком, и я не мог найти проблемы, которые вы описываете. Если я реализую событие TextChanged для TextBox, как показано ниже, оно работает, даже если я вставляю что-то. Проверка на нуль необходима, потому что, если текстовое поле имеет начальное значение, метод Initilialize вызывает событие изменения до создания метки.

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     TextBox tbSource = (sender as TextBox); 

     if (lblOutput == null) 
      return; 

     lblOutput.Content = tbSource.Text; 

    }