Как получить текст текущей строки в курсор из элемента управления Silverlight 4 RichTextBox - PullRequest
2 голосов
/ 04 августа 2010

В элементе управления Winforms RichTextBox я ранее использовал метод GetLineFromCharIndex и GetFirstCharIndexOfCurrentLine для определения начальной и конечной точек введенного текста в текущей строке.

Я борюсь с новым элементом управления RichTextBox в Silverlight 4, так как не существует эквивалентных методов. 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;
}

Ответы [ 2 ]

1 голос
/ 08 ноября 2010

Мне нужно было выяснить, когда я был в верхней или нижней строке 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;
    }
1 голос
/ 12 августа 2010

Я не думаю, что вы не можете избежать выбора, это правильный способ сделать это («выбор» просто логический), но вы можете избежать GetPositionFromPoint с TextPointer.GetNextInsertionPosition(LogicalDirection ): начать с richTextBox1.Selection.Start и двигаться к началу строки (char! = '\ N')

...