2012-01-24 2 views
2

Мне нужно показать пользователю, как и в файле notepad.exe, начало выбора и длину его текста на курсоре.RichTextbox SelectionStart возвращает неверный индекс

Длина выбора не представляет проблемы, так как Richtextbox поддерживает свойство выбора с помощью начала и конца.

http://msdn.microsoft.com/en-us/library/system.windows.documents.textpointer.getoffsettoposition.aspx

Но StartIndex моего RichTexbox всегда 2 вместо 0 если установить курсор на первую позицию документа. Если я прочитаю полный текст, он находится на 0. Но если я нажму SPACE, а затем BACKSPACE, то текстовое поле пуст, но счетчик StartIndex находится на 2

Любая идея?

TB HyperTerminal Win7


* EDIT * ПЕРВОЕ РЕШЕНИЕ

Хорошо, вот рабочий раствор шахты. Но я думаю, что есть лучший способ сделать это.

''' <summary> 
    ''' Get the position of the cursor. Ignores all formatting characters like ENTER and PARAGRAPH. Just counts the visible characters. 
    ''' </summary> 
    ''' <param name="rtb">The richtextbox the value should be determined</param> 
    ''' <returns>Index value of the cursor. 0 is at the first position. After position is behind characters "123" it would return the index 3.</returns> 
    ''' <remarks>Watch out for performance, Use this methode in separated. Timo Böhme, 2012</remarks> 
    Private Function GetPositionOfCursor(ByVal rtb As RichTextBox) As Integer 
     Dim contentStart As TextPointer = rtb.Document.ContentStart 
     Dim res As Integer = 0 
     Dim CursorIndex As Integer = contentStart.GetOffsetToPosition(rtb.CaretPosition) 
     Dim j As Integer = 0 

     Do 
      If j > CursorIndex Then Exit Do 
      If contentStart.GetPositionAtOffset(1, LogicalDirection.Forward) Is Nothing Then 
       Exit Do 
      ElseIf contentStart.GetPointerContext(LogicalDirection.Backward) = TextPointerContext.Text Then 
       res += 1 
      End If 

      contentStart = contentStart.GetPositionAtOffset(1, LogicalDirection.Forward) 
      j += 1 
     Loop 

     Return res 
    End Function 
+0

RichTextBox автоматически создает абзац и прогон (или что-то подобное), следовательно, ненулевой индекс. Курсор не в начале, а в первом прогоне в первом абзаце. –

+0

Еще раз спасибо H.B. за ваш очень быстрый ответ. У вас есть решение? – Nasenbaer

+0

Нет, иначе я бы отправил ответ. –

ответ

1

Я не знаю, является ли это реальный ответ на ваш вопрос, но я использую этот простой трюк, чтобы получить индекс курсора, связанные карапуз текста:

TextRange range = new TextRange(Document.ContentStart, CaretPosition);
int n = range.Text.Length;

I Я работаю над редактором, основанным на WPF richtextbox. Поскольку форматирование в реальном времени (например, выделение ключевых слов и т. Д.) Происходит очень медленно, я создаю новый документ в другом потоке. В этом потоке текст форматируется в соответствующих прогонах, а не форматирует их как часть абзаца richtextbox. После завершения первоначальный вариант заменяется новым. Работает очень хорошо и невероятно быстро (по крайней мере, по сравнению с MS).

Надеюсь, это даст вам вдохновение и/или идеи.