2017-04-25 4 views
1

J'ai un RichTextBox dans lequel un utilisateur peut taper du texte avec son code de couleur à la volée en suivant les règles.Codage couleur efficace du texte dans un RichTextBox

  1. { } () | . (dot) Ces caractères doivent être rouges.
  2. [A-Z] [a-z] [0-9] soulignement et trait d'union. Ceux-ci devraient être gris foncé.
  3. Tout le reste devrait être bleu.

J'ai maintenant ce code sur l'événement lorsque le contenu de la boîte change. Cette méthode est appelée chaque fois qu'une modification est détectée dans le contenu de la zone de texte. Comme vous pouvez le constater, cela peut être très lent quand il y a des centaines de caractères. Comment puis-je améliorer cette situation.

+0

Vous pouvez essayer de mettre en file d'attente les mises à jour au lieu de les exécuter après chaque modification, voir [this] (http://stackoverflow.com/q/15587767/1997232). – Sinatr

+0

@Sinatr Une réponse plus élaborée serait très appréciée. –

+1

Peut-être que vous pouvez utiliser un éditeur, qui prend en charge la coloration syntaxique comme [AvalonEdit] (http://avalonedit.net). Dans la [documentation] (http://avalonedit.net/documentation/) vous pouvez trouver [comment définir vos propres règles] (http://avalonedit.net/documentation/html/4d4ceb51-154d-43f0-b876-ad9640c5d2d8 .htm). – Oliver

Répondre

0

Vous pourriez probablement le faire sur l'événement KeyUp afin que vous ne regardiez que le seul caractère qui a changé. Je ne sais pas si ce serait beaucoup plus rapide, voire pas du tout.

private void rtb_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 

    if (e.KeyCode == Keys.OemPeriod 
     rtb.SelectionColor = Color.Red; 
    ... 
    } 
} 
+0

Aucune infraction, mais cela aurait dû être un commentaire pas une réponse.Je ne vais pas, mais quelqu'un peut voter vers le bas cette réponse. Maintenant, à propos de votre solution, Comment saurai-je exactement où le changement s'est produit? Il peut être entre le contenu qui est déjà dans la zone de texte. –

+0

Je ne suis pas certain d'avoir compris votre question sur l'origine du changement. L'événement KeyUp aura un argument d'événement qui vous dira quelle touche a été enfoncée pour que vous puissiez évaluer à ce moment-là la couleur du caractère unique au lieu de faire défiler tout le texte précédemment saisi. https://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet -2 –

+0

Supposons que ce soit le texte à l'intérieur de la boîte 'abcdef .. ((' maintenant l'utilisateur place le curseur à côté de la lettre 'c' puis appuie sur' '' '' 'Maintenant, selon votre logique je sais quelle touche a été enfoncée –