Мне нужно показать пользователю, как в notepad.exe, начало выделения и длину его текста на курсоре.
Длина выделения не проблема, потому что Richtextbox поддерживает свойство Selection с помощью Start и End.
http://msdn.microsoft.com/en-us/library/system.windows.documents.textpointer.getoffsettoposition.aspx
Но начальный индекс моего RichTexbox всегда равен 2
вместо 0
, если я установил курсор на первую позицию документа.Если я удаляю полный текст, он находится на 0
.Но если я нажму SPACE
, а затем BACKSPACE
, текстовое поле будет пустым, но счетчик StartIndex будет включен 2
Есть идеи?
![TB HyperTerminal Win7](https://i.stack.imgur.com/GMz1F.png)
* РЕДАКТИРОВАТЬ * ПЕРВОЕ РЕШЕНИЕ
Хорошо, это мой рабочий раствор.Но я думаю, что есть лучший способ сделать это.
''' <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