GetLineStartPosition
is able to return you the start of a line but not the end of a line. For that you will have to combine it with GetInsertionPosition
.
Here's how GetLineStartPosition
works:
GetLineStartPosition(-1)
gets the start of the previous line
GetLineStartPosition(0)
gets the start of the current line
GetLineStartPosition(1)
gets the start of the next line
You can also call it with larger integers to get lines further away.
To get the end of a line just get the start of the next line, then get the prior insertion position. Basically it is this:
pointer.GetLineStartPosition(1).GetInsertionPosition(LogicalDirection.Backward);
However this does not work when you are on the last line of a document: GetLineStartPosition
returns null.
The easy way to fix it is to do this:
var nextStart = pointer.GetLineStartPosition(1)
var lineEnd = (nextStart !=null ? nextStart : pointer.DocumentEnd).GetInsertionPosition(LogicalDirection.Backward);
The reason GetInsertionPosition
must be used rather than just moving one symbol over using GetNextContextPosition
or GetPointerAtOffset
is that every element in the FlowDocument
element tree is a symbol. So for example if your current line is the last line in a table, GetLineStartPosition(1)
will return a pointer inside the first Run in the first Paragraph following the table, whereas the end of the current line is a the end of the last Run in the last Paragraph in the last TableCell, ... you get the idea.
It is best to let WPF handle all the complexity of moving TextPointers
around the FlowDocument
, which means using GetInsertionPosition
to find the end of the same line the original TextPointer
points to.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…