Как получить TextRange текста, написанного пользователем в RichTextBox

У меня есть RichTextBox, который похож на «консоль». В «cmd» я отображаю данные из SSH-соединения, а также разрешаю что-то писать в «cmd» RichTextBox.

public void ConnectTTY()
    {
        NewTerminal = new TTY(HostBox.Text, "", LoginBox.Text, PasswordBox.Text);

        Thread.Sleep(1000);

        ReadStreamAsync(NewTerminal.reader, cmd);

        // cmd is my RichTextBox . At first I am filling it with data from server
        // and in next step I am allowing user to write some command 
        cmd.Focus();


        cmd.CaretPosition = cmd.Document.ContentEnd;
        cmd.ScrollToEnd();

        LastChar =    cmd.Document.ContentEnd ;
    }

В последних строках я использую TextPointer «LastChar», чтобы получить позицию последнего добавленного контента, потому что я хочу получить то, что пользователь напишет в RichTextBox.

В событии «Ввод» я использую ReWriteStream, чтобы получить последний текст и отправить его через SSH.

 public void ReWriteStream()
    {

        string myText = new TextRange(LastChar, cmd.Document.ContentEnd).Text ;


        MessageBox.Show("Tekst: " + myText.ToString()  );

        if ( myText.Length != 0 )
        {
            WriteStreamAsync(myText, NewTerminal.writer, NewTerminal.stream);
            ReadStreamAsync(NewTerminal.reader, cmd);

            //WriteStream(myText, NewTerminal.writer, NewTerminal.stream);
            //Thread.Sleep(1000);
            //ReadStream(NewTerminal.reader, cmd);


        }
        cmd.Focus();

    }

Но каждый раз моя переменная myText пуста.

string myText = new TextRange(LastChar, cmd.Document.ContentEnd).Text ;

Как мне получить любой текст, написанный в моем RichTextBox после позиции LastChar?

Спасибо за любую помощь, С уважением, Виктор

изменить: я поместил строку в richtextbox для анализа положения каретки:

public void ConnectTTY()
    {
        NewTerminal = new TTY(HostBox.Text, "", LoginBox.Text, PasswordBox.Text);

        Thread.Sleep(1000);

        ReadStreamAsync(NewTerminal.reader, cmd);



        cmd.Focus();


        cmd.CaretPosition = cmd.Document.ContentEnd;
        cmd.ScrollToEnd();

        cmd.CaretPosition.InsertTextInRun("|1|");

        // LastChar = cmd.CaretPosition.DocumentEnd;

    }

и тут :

 public void ReWriteStream()
    {
        string caret;
        string myText;



        LastChar = cmd.CaretPosition.DocumentEnd.GetInsertionPosition(LogicalDirection.Backward);

        cmd.CaretPosition.InsertTextInRun("|2|");

        myText = new TextRange(LastChar, cmd.CaretPosition.DocumentEnd).Text;
       // myText = new TextRange(LastChar, cmd.Document.ContentEnd).Text;

        MessageBox.Show("Text : " +  myText.ToString()  );

        if ( myText.Length != 0 )
        {
            WriteStreamAsync(myText, NewTerminal.writer, NewTerminal.stream);
            ReadStreamAsync(NewTerminal.reader, cmd);

            //WriteStream(myText, NewTerminal.writer, NewTerminal.stream);
            //Thread.Sleep(1000);
            //ReadStream(NewTerminal.reader, cmd);


        }
        cmd.Focus();

    }

И я получаю именно то, что должно быть в cmd RichTextBox : "У вас есть почта. -bash-3.2$ |1| ls -l |2|"


person Wiktor    schedule 08.06.2015    source источник
comment
Какой тип объекта LastChar? текстовый указатель? или?   -  person Dylan Corriveau    schedule 08.06.2015
comment
Да, это TextPointer.   -  person Wiktor    schedule 08.06.2015
comment
Это TextPointer, который я изменяю только в ConnectTTY(), чтобы получить позицию ContentEnd последнего автоматически вставленного текста в cmd RichTextBox.   -  person Wiktor    schedule 08.06.2015


Ответы (1)


Другой метод — захватить последнюю позицию вставки, а затем использовать ее для диапазона текста.

public void ReWriteStream()
{
    var myText = new TextRange(rtb.CaretPosition.GetLineStartPosition(0), rtb.CaretPosition.GetLineStartPosition(1) ?? rtb.CaretPosition.DocumentEnd).Text;    
    ...

}
person Dylan Corriveau    schedule 08.06.2015
comment
Спасибо за Ваш ответ, к сожалению, это не помогло. - person Wiktor; 08.06.2015
comment
Если я использую что-то вроде этого: `string myText = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd).Text; ` Я могу получить весь текст, а также текст, вставленный пользователем. - person Wiktor; 08.06.2015
comment
Еще раз спасибо, что уделили время моей проблеме, но опять же это не помогает. - person Wiktor; 08.06.2015
comment
Я конечно пробовал: LastChar = rtb.CaretPosition.DocumentEnd.GetInsertionPosition(LogicalDirection.Backward); а также LastChar = rtb.Document.ContentEnd.GetInsertionPosition(LogicalDirection.Backward); - person Wiktor; 08.06.2015
comment
Пожалуйста, взгляните на мой первый пост, я вставляю строку |1| и |2| . Текст, вставленный пользователем ls -l, находится именно там, где он должен быть. Я понятия не имею, почему я не могу получить его в переменной myText. - person Wiktor; 08.06.2015
comment
увидеть измененный ответ - person Dylan Corriveau; 08.06.2015
comment
Спасибо, действительно помогает. Мне нужно понять, почему ;) Я постараюсь внести некоторые изменения и посмотреть, что произойдет. Наилучшие пожелания ! - person Wiktor; 08.06.2015