2010-06-17 43 views
4

有點背景。我希望能夠處理插入在WPF RichTextBox中的行的文本。請參閱我之前關於TextPointer類的問題:How to keep track of TextPointer in WPF RichTextBox?使用GetLineStartPosition獲取WPF RichTextBox中行的結尾

我知道如何通過使用帶有0作爲參數的GetLineStartPosition來獲取當前行的開始處的TextPointer,但是現在想要在行尾獲得TextPointer。在我之前的問題中提出,使用GetLineStartPosition方法是可行的。

如果有人能解釋一下GetLineStartPosition如何處理行結尾指針,我將不勝感激。

在此先感謝您的幫助。

回答

11

GetLineStartPosition能夠返回你一行的開始,但不是一行的結尾。爲此,您必須將其與GetInsertionPosition結合使用。

這裏是GetLineStartPosition是如何工作的:

  • GetLineStartPosition(-1)獲取前行
  • GetLineStartPosition(0)開始得到當前行
  • GetLineStartPosition(1)開始得到下一行的開始

你也可以用更大的整數來調用它以使線條更遠。

爲了得到一條線的末尾就得到下一條線的開始,然後獲得先前的插入位置。基本上,它是這樣的:GetLineStartPosition返回null:

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

但是當你在文檔的最後一行,這並不工作。

最簡單的方法解決它是這樣做:

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

GetInsertionPosition必須使用,而不是僅僅在使用GetNextContextPositionGetPointerAtOffset移動一個符號的原因是,在FlowDocument元素樹的每一個元素是一個符號。因此,例如,如果當前行是表中的最後一行,則GetLineStartPosition(1)將在表格後面的第一個段落中的第一個Run中返回一個指針,而當前行的結尾是最後一個Run的結尾最後一個TableCell中的段落,......你明白了。

最好是讓WPF處理FlowDocument,這意味着使用GetInsertionPosition找到同一行原TextPointer點結束走動TextPointers的全部複雜性。

+1

非常感謝Ray。再次,對我的問題非常有幫助。 – 2010-06-18 08:55:42

2

當前行的結尾與下一行的開頭相同,因此您可以使用GetLineStartPosition(1)。請注意,當你在最後一行時這將返回null,所以你可能想在這種情況下使用DocumentEnd

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

其實當前行的結尾與下一行的開始不一樣。他們可能在不同的段落,表格單元等。即使在一個普通的舊文本文件中也是如此:在每行的結尾和下一行的開頭之間有一個CRLF。 FlowDocument中的表格,部分,跨度,數字,浮點數,InlineUIContainers等複雜程度更高。 – 2010-06-17 13:21:55