Использование GetLineStartPosition для получения конца строки в WPF RichTextBox - PullRequest
4 голосов
/ 17 июня 2010

Немного фона. Я хотел бы иметь возможность обрабатывать текст для строки, на которой находится каретка в WPF RichTextBox. Пожалуйста, смотрите мой предыдущий вопрос о классе TextPointer: Как отслеживать TextPointer в WPF RichTextBox? .

Я знаю, как получить TextPointer в начале текущей строки, используя GetLineStartPosition с 0 в качестве аргумента, но теперь хотел бы получить TextPointer в конце строки. В моем предыдущем вопросе было предложено, что это возможно с помощью метода GetLineStartPosition.

Буду признателен, если кто-нибудь немного объяснит, как работает GetLineStartPosition в отношении указателей конца строки.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

11 голосов
/ 17 июня 2010

GetLineStartPosition может вернуть вам начало строки, но не конец строки.Для этого вам нужно будет объединить его с GetInsertionPosition.

Вот как работает GetLineStartPosition:

  • GetLineStartPosition(-1) получает начало предыдущей строки
  • GetLineStartPosition(0) получает начало текущей строки
  • GetLineStartPosition(1) получает начало следующей строки

Вы также можете вызывать ее с большими целыми числами, чтобы убрать строки дальше.

Чтобы получить конец строки, просто получите начало следующей строки, затем получите предыдущую позицию вставки.В основном это так:

pointer.GetLineStartPosition(1).GetInsertionPosition(LogicalDirection.Backward);

Однако это не работает, когда вы находитесь на последней строке документа: GetLineStartPosition возвращает ноль.

Простой способ исправить этосделайте это:

var nextStart = pointer.GetLineStartPosition(1)
var lineEnd = (nextStart !=null ? nextStart : pointer.DocumentEnd).GetInsertionPosition(LogicalDirection.Backward);

Причина, по которой GetInsertionPosition следует использовать, а не просто перемещать один символ поверх GetNextContextPosition или GetPointerAtOffset, заключается в том, что каждый элемент в дереве элементов FlowDocument является символом.Так, например, если ваша текущая строка является последней строкой в ​​таблице, GetLineStartPosition(1) вернет указатель внутри первого цикла в первом абзаце после таблицы, тогда как конец текущей строки является концом последнего цикла впоследний абзац в последнем TableCell, ... вы поняли.

Лучше всего позволить WPF справиться со всей сложностью перемещения TextPointers вокруг FlowDocument, что означает использование GetInsertionPosition длянайдите конец той же строки, на которую указывает исходный TextPointer.

2 голосов
/ 17 июня 2010

Конец текущей строки совпадает с началом следующей строки, поэтому вы можете использовать GetLineStartPosition(1).Обратите внимание, что при последней строке будет возвращено значение null, поэтому вы можете использовать DocumentEnd в этом случае.

var currentLine = new TextRange(rtb.CaretPosition.GetLineStartPosition(0), rtb.CaretPosition.GetLineStartPosition(1) ?? rtb.CaretPosition.DocumentEnd).Text;
...