Получить часть текста из RichTextBox - PullRequest
0 голосов
/ 26 ноября 2011

Может кто-нибудь сказать, пожалуйста, что не так с этим. Я пытаюсь получить текст между несколькими символами перед кареткой и кареткой. «Сопоставимый» никогда не длиннее, чем фактический текст в RichTextBox.

Это код, который у меня есть:

int coLen = comparable.Length;
TextPointer caretBack = rtb.CaretPosition.GetPositionAtOffset(coLen, 
    LogicalDirection.Backward);
TextRange rtbText = new TextRange(caretBack, rtb.CaretPosition);
string text = rtbText.Text;

Возвращает text = ""

Пожалуйста, помогите!

1 Ответ

4 голосов
/ 26 ноября 2011

Это работает как положено, я получаю I a

Код:

        RichTextBox rtb = new RichTextBox();
        rtb.AppendText("I am adding some texts to the richTextBox");
        rtb.CaretPosition = rtb.CaretPosition.DocumentEnd;

        int coLen = 3;
        TextPointer caretBack = rtb.CaretPosition.GetPositionAtOffset(-coLen);
        TextRange rtbText = new TextRange(caretBack, rtb.CaretPosition);
        string ttt = rtbText.Text;

EDIT

Вот метод MSTest для объяснения поведения кареты и чтения:

 [TestMethod]
    public void TestRichtTextBox()
    {
        RichTextBox rtb = new RichTextBox();
        rtb.AppendText("I am adding some texts to the richTextBox");

        int offset = 3;

        TextPointer beginningPointer = rtb.CaretPosition.GetPositionAtOffset(offset);
        TextPointer endPointer = rtb.CaretPosition.DocumentEnd;
        TextRange rtbText = new TextRange(beginningPointer, endPointer);

        Assert.IsTrue(rtbText.Text == "m adding some texts to the richTextBox\r\n");

        // Now we if we keep the same beggining offset but we change the end Offset to go backwards.

        beginningPointer = rtb.CaretPosition.GetPositionAtOffset(3);
        endPointer = rtb.CaretPosition; // this one is the beginning of the text
        rtbText = new TextRange(beginningPointer, endPointer);
        Assert.IsTrue(rtbText.Text == "I a");

        // Nowe we want to read from the back three characters.
        // so we set the end Point to DocumentEnd.

        rtb.CaretPosition = rtb.CaretPosition.DocumentEnd;
        beginningPointer = rtb.CaretPosition.GetPositionAtOffset(-offset);
        endPointer = rtb.CaretPosition; // we already set this one to the end document
        rtbText = new TextRange(beginningPointer, endPointer);
        Assert.IsTrue(rtbText.Text == "Box");
    }

Плюс вот комментарий от MSDN об отрицательном индексе:

смещение Тип: System.Int32 Смещение в символах, для которого рассчитать и вернуть позицию. Если смещение отрицательное, позиция рассчитывается в логическом направлении, противоположном этому указывается свойством LogicalDirection.

...