Как применить цветовое форматирование к Richtextbox *по мере ввода пользователем* (VB.Net)

У меня есть RichTextBox с событием OnChanged. Событие OnChanged должно просматривать каждую строку в RichTextBox и, если строка имеет основную длину, окрашивать ее в красный цвет, в противном случае — в черный. Как мне это сделать? Я думаю, что можно выбрать от индекса a до индекса b и установить цвет выделения, но я думаю, что это потеряет позицию курсора. Как мне также сохранить положение курсора? Спасибо за любые предложения.


person El Ronnoco    schedule 18.10.2010    source источник


Ответы (2)


Посмотрите на SelectionStart и SelectionLength, чтобы выбрать текст для выделения.

Чтобы сохранить положение курсора, я думаю, вы можете просто сохранить текущее SelectionStart перед тем, как начать выделение, а затем сбросить его до этого значения после того, как вы закончили выделение.

Просто будьте осторожны, если пользователь продолжает печатать, пока вы не выделяете. Вам, вероятно, придется перехватывать события клавиатуры и кэшировать их, а затем вставлять их после сброса SelectionStart в правильное место (или может быть проще, хотя и менее удобно для пользователя, просто игнорировать любые нажатия клавиш, пока вы делаете выделение).

person Hans Olsson    schedule 18.10.2010
comment
Привет, спасибо за ваш ответ. Я знаю, что это может быть довольно неудобно, особенно если пользователь выбрал фрагмент текста. Для целей моего приложения я просто предполагаю, что у них есть каретка в одной позиции, а не выбор блока. Мое решение работает достаточно хорошо. Спасибо. - person El Ronnoco; 18.10.2010

Private Sub txtKeys_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtKeys.TextChanged
    Dim iStart As Int32 = txtKeys.SelectionStart
    Dim iPos As Int32 = 0
    For Each s As String In Split(txtKeys.Text, vbLf)
        If s.Length > 0 Then
            txtKeys.Select(iPos, iPos + s.Length)
            If isPrime(s.Length) Then
                txtKeys.SelectionColor = Color.GreenYellow
            Else
                txtKeys.SelectionColor = Color.Black
            End If
        End If
        iPos += s.Length + 1
    Next
    txtKeys.Select(iStart, 0)
End Sub

Извините за отсутствие комментариев! Я предполагаю, что это станет крайне неэффективным при применении к большому свойству .text, но это не предполагаемое использование текстового поля.

person El Ronnoco    schedule 18.10.2010