RichTextbox SelectionStart возвращает неверный индекс - PullRequest
3 голосов
/ 24 января 2012

Мне нужно показать пользователю, как в 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


* РЕДАКТИРОВАТЬ * ПЕРВОЕ РЕШЕНИЕ

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

''' <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

1 Ответ

2 голосов
/ 31 января 2012

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

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

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

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

...