如何从Silverlight 4 RichTextBox控件获取当前行文本到光标

时间:2010-08-04 16:13:50

标签: silverlight-4.0 richtextbox

在Winforms RichTextBox控件中,我之前使用 GetLineFromCharIndex 方法和 GetFirstCharIndexOfCurrentLine 来计算当前行上键入文本的起点和终点。< / p>

我正在努力使用Silverlight 4中的新RichTextBox控件,因为似乎没有等效的方法。 GetPositionFromPoint 可用,但看起来很笨重。

干杯。

更新了...我已经做了一些工作,但这需要我使用控件的Select方法,这感觉非常错误......

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;
}

2 个答案:

答案 0 :(得分:1)

我认为你无法避免选择,这是一种正确的选择(“选择”只是一个逻辑选择),但你可以避免使用GetPositionFromPoint TextPointer.GetNextInsertionPosition(LogicalDirection ) :从richTextBox1.Selection.Start开始,然后移向行的开头(char!='\ n')

答案 1 :(得分: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;
    }