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
.