2010-08-04 101 views
2

在我以前使用過GetLineFromCharIndex方法的WinForms RichTextBox控件和GetFirstCharIndexOfCurrentLine到光標移到輸入文本的制定出起點和終點他目前的路線。如何獲取當前行文本從Silverlight 4中RichTextBox控件

我在Silverlight 4中使用新的RichTextBox控件掙扎着,因爲看起來沒有等效的方法。 GetPositionFromPoint可用,但似乎很笨重。

乾杯。

更新...我好歹去使這項工作,但這個要求我使用該控件的選擇方法,這種感覺非常錯誤的...

private string GetCurrentLine() 
{ 
    TextPointer prevSelStart = richTextBox1.Selection.Start; 
    Point lineStart = new Point(0, prevSelStart.GetCharacterRect(LogicalDirection.Forward).Y); 
    TextPointer prevSelEnd = richTextBox1.Selection.End; 
    TextPointer currentLineStart = richTextBox1.GetPositionFromPoint(lineStart); 

    //need to find a way to get the text between two textpointers 
    //other than performing a temporary selection in the rtb 
    richTextBox1.Selection.Select(currentLineStart, prevSelStart); 
    string text = richTextBox1.Selection.Text; 
    //revert back to previous selection 
    richTextBox1.Selection.Select(prevSelStart, prevSelEnd); 

    return text; 
} 

回答

1

我不認爲你可以'不要選擇,這是一個正確的方法來做到這一點(「選擇」只是一個合理的方式),但你可以避免GetPositionFromPointTextPointer.GetNextInsertionPosition(LogicalDirection):從richTextBox1.Selection.Start開始,並移動到行的開始(char!='\ n')

+0

我的這種方法關注的是,是火災SelectionChanged事件人爲的兩倍。爲了克服這一點,我需要暫時取消訂閱活動用戶。醜陋。 – 2010-08-13 11:01:41

1

我需要弄清楚什麼時候我在RTB的頂線或底線。爲此,我使用了GetCharacterRect方法,然後比較頂部以查看它是否在最後一行或第一行。

您可以這樣做,並使用文本指針來移動文本和頂部不匹配的次數。

這裏的代碼,看看如果光標在第一或最後一行:

private bool IsCursorOnFirstLine() 
    { 
     TextPointer contentStart = this.ContentStart; 
     TextPointer selection = this.Selection.End; 
     Rect startRect = contentStart.GetCharacterRect(LogicalDirection.Forward); 
     Rect endRect = selection.GetCharacterRect(LogicalDirection.Forward); 
     return startRect.Top == endRect.Top; 
    } 

    private bool IsCursorOnLastLine() 
    { 
     TextPointer start = this.Selection.Start; 
     TextPointer end = this.ContentEnd; 
     Rect startRect = start.GetCharacterRect(LogicalDirection.Forward); 
     Rect endRect = end.GetCharacterRect(LogicalDirection.Backward); 
     return startRect.Top == endRect.Top; 
    } 
相關問題