Изменить стиль шрифта для всех экземпляров строки в RichTextBox

Я работаю над проектом VB.NET 4.5 в VS2013.

У меня есть richtextbox в форме, и когда нажимается кнопка, мне нужно переключить настройку BOLD для всех экземпляров определенной строки, найденной в richtextbox.

Я собрал код на основе этого вопроса.

Private Sub ToggleBold()

    rtxtOutputText.SelectionStart = rtxtOutputText.Find("@#$%", RichTextBoxFinds.None)

    rtxtOutputText.SelectionFont = New Font(rtxtOutputText.Font, FontStyle.Bold)
End Sub

Однако при нажатии кнопки переключения жирным шрифтом она выделяет только первый экземпляр строки "@#$%".

Как я могу установить все экземпляры строки жирным шрифтом? Также может быть несколько из них, связанных друг с другом ("@#$%@#$%@#$%"), поэтому каждый из них также должен быть выделен жирным шрифтом.

(Я знаю, что упоминал переключение жирным шрифтом, но я настрою часть переключения позже, сейчас я просто пытаюсь заставить жирный шрифт на всех экземплярах работать правильно...)

1 ответ

Решение

Просто добавьте цикл и используйте RichTextBox.Find(String, Int32, RichTextBoxFinds) перегрузка, чтобы указать, с чего начать искать. Посмотрите из текущего индекса + 1, чтобы он не возвращался снова.

Вы также должны выбрать слово, чтобы убедиться, что жирный шрифт применяется только к текущему экземпляру, а не к тексту вокруг него.

Private Sub ToggleBold()
    'Stop the control from redrawing itself while we process it.
    rtxtOutputText.SuspendLayout()

    Dim LookFor As String = "@#$%"
    Dim PreviousPosition As Integer = rtxtOutputText.SelectionStart
    Dim PreviousSelection As Integer = rtxtOutputText.SelectionLength
    Dim SelectionIndex As Integer = -1

    Using BoldFont As New Font(rtxtOutputText.Font, FontStyle.Bold)
        While True
            SelectionIndex = rtxtOutputText.Find(LookFor, SelectionIndex + 1, RichTextBoxFinds.None)

            If SelectionIndex < 0 Then Exit While 'No more matches found.

            rtxtOutputText.SelectionStart = SelectionIndex
            rtxtOutputText.SelectionLength = LookFor.Length

            rtxtOutputText.SelectionFont = BoldFont
        End While
    End Using

    'Allow the control to redraw itself again.
    rtxtOutputText.ResumeLayout()

    'Restore the previous selection.
    rtxtOutputText.SelectionStart = PreviousPosition
    rtxtOutputText.SelectionLength = PreviousSelection
End Sub

Благодарим Plutonix за указание избавиться от шрифта.

Другие вопросы по тегам