¿Cómo seleccionar texto de RichTextBox y luego colorearlo?

Quiero crear un editor simple como Notepad ++ con funcionalidad simple … Necesito colorear una palabra específica en el área del cuadro de texto enriquecido. ¿Cómo puedo hacer eso?

Por ejemplo: cuando el usuario escribe estas palabras, quiero colorearlas con el color azul. Estas palabras son: for , while , if , try , etc.

¿Cómo puedo hacer que richtextbox seleccione una palabra específica y luego colorearla? Y, si quiero hacer un comentario y colorear todo después de // , ¿cómo se hace eso en richtextbox?

¿Cómo numerar la línea en el cuadro de texto, entonces puedo ahora el número de línea cuando estoy codificando en mi editor?

Aquí hay un código sobre el que puede construir para lograr la funcionalidad que desea.

 private void ColourRrbText(RichTextBox rtb) { Regex regExp = new Regex("\b(For|Next|If|Then)\b"); foreach (Match match in regExp.Matches(rtb.Text)) { rtb.Select(match.Index, match.Length); rtb.SelectionColor = Color.Blue; } } 

El artículo de CodeProject Habilitar el resaltado de syntax en un RichTextBox muestra cómo usar RegEx en un RichTextBox para realizar resaltado de syntax. Específicamente, mira el SyntaxRichtTextBox.cs para la implementación.

En general, debe trabajar en la selección en RichTextBox. Puede manipular la selección actual usando el método Find o usando las propiedades SelectionStart y SelectionLength . Luego puede cambiar las propiedades del texto seleccionado usando las propiedades de SelectionXXX . Por ejemplo, SelectionColor establecería el color de la selección actual, etc. Por lo tanto, debe analizar el texto en richtextbox y luego seleccionar parte de los textos y cambiar sus propiedades según sus requisitos.

Escribir un buen editor de texto usando RichTextBox puede ser bastante engorroso. Deberías usar alguna biblioteca como Scintilla para eso. Eche un vistazo a ScintillaNet , un contenedor .NET sobre Scintilla.

¿Sabías que Notepad ++ usa Scintilla ?

En realidad no tiene que reinventar la rueda pasando por todos los problemas ya que hay un puerto .NET de Scintilla llamado ScintillaNET que puede incrustar libremente en su aplicación como el editor de código fuente 🙂

Pero para responder a su pregunta, hay algunas partes que necesita comprender

  1. Encontrar qué color
  2. Cuándo colorear
  3. Cómo colorear

  4. Para la primera parte, puede haber diferentes enfoques, pero creo que usar expresiones regulares sería una buena opción. Lo siento, pero no conozco las expresiones regulares, así que no puedo ayudarte en ese caso.

  5. Cuándo colorear es muy importante y si lo haces mal, tu aplicación sufrirá una gran penalización de rendimiento. Sugiero que se refiera a XPath Visualizer que fue hecho por nuestro propio miembro de Stack Overflow, Cheeso. Echa un vistazo a la fuente sobre cómo se realizó la coloración de la syntax. Pero si tu ScintillaNET, todo estaría bien cuidado. De todos modos, realmente no puedo encontrar esta documentación en la que mostró claramente cómo se realizó el coloreado del texto. Definitivamente lo publicaría aquí si lo encuentro.

  6. La tercera pregunta que creo está cubierta por VinayC. Pero básicamente usas SelectionColor junto con SelectionStart .

aquí hay un buen enlace en el sitio web c-sharpcorner.com sobre el resaltado básico de la syntax richtextbox. Supongo que usted y cualquiera que visite esta página por un problema similar desea hacerlo con fines de aprendizaje. Pero si alguien quiere hacerlo para algunos haciendo un IDE de nivel comercial, entonces debe usar scintilla o algo similar. Otro enfoque para esto es cambiar directamente el RTF de richtextbox . Mira en codeproject.com hay muchos artículos similares a este problema.

Tuve algunos problemas con eso y aquí está mi solución, me supera por qué tiene que hacerse así, pero funciona:

  // position on end of control... richTextBox.UpdateLayout(); richTextBox.ScrollToEnd(); richTextBox.UpdateLayout(); // ...then select text and it will be position on top of control. richTextBox.Focus(); richTextBox.Selection.Select(foundRange.Start, foundRange.End); richTextBox.BringIntoView();