2010-04-05 6 views
2

J'applique la mise en forme aux jetons sélectionnés dans un RichTextBox WPF. Pour ce faire, je reçois une TextRange qui englobe le jeton que je voudrais mettre en évidence. Je vais donc changer la couleur du texte comme celui-ci:WPF RichTextBox - Formatage de texte tapé

// Get start and end pointer for token 
TextPointer startPointer = run.ContentStart.GetPositionAtOffset(startOffset); 
TextPointer endPointer = run.ContentStart.GetPositionAtOffset(endOffset); 

// Get text range for token 
TextRange textRange = new TextRange(startPointer, endPointer); 

// Highlight token 
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue); 

Ce qui se passe sur l'événement TextChanged de mon RichTextBox.

La mise en forme est appliquée comme prévu, mais si vous continuez à saisir du texte, le nouveau texte héritera de la mise en forme qui a déjà été appliquée au mot adjacent. Je souhaite que la mise en forme de tout nouveau texte utilise les options de mise en forme par défaut définies dans les propriétés RichTextBox. Est-ce possible? Sinon, je pourrais mettre en évidence tous les jetons que je ne veux pas être bleu avec les options de formatage par défaut, mais cela me semble gênant.

Répondre

3

N'est-ce pas le comportement standard? Si je surligne du texte dans Word, le place en gras, déplace le curseur à côté de ce texte et tape, le nouveau texte devient gras aussi. J'imagine que MS fait que la zone de texte riche fonctionne de la même manière que la zone de texte dans Word.

Si vous sélectionnez un jeton basé sur la correspondance de certains critères, comme pour la coloration syntaxique, pourriez-vous essayer d'appliquer le style au texte après le curseur est à 1 caractère du jeton? Par exemple:

SomeToken |

au lieu de

SomeToken |

| est le curseur. Le curseur est séparé du jeton par un espace dans le premier exemple, donc si votre programme trouve SomeToken il obtiendra la plage de texte avant le S avant le (espace). J'imagine que le style ne sera pas appliqué au texte nouvellement entré alors. Je vais admettre que c'est juste une supposition, et j'ai peut-être mal compris votre situation exacte de la description de votre problème. Un code supplémentaire peut être utile, en particulier l'événement TextChanged mentionné ou le code qui crée la plage de texte.

+0

Merci pour votre réponse Benny. Oui, c'est le comportement standard mais j'essaye d'implémenter la coloration syntaxique et préférerais ne pas le faire. Dans l'événement TextChanged, j'appelle simplement ma routine d'analyse qui produit des jetons qui ont les positions de début et de fin que j'utilise pour créer la TextRange (j'ai ajouté ce code à ma question d'origine). L'utilisation d'espaces blancs comme délimiteur est une possibilité mais je préfère l'éviter car les espaces ne sont pas garantis. Merci, Alan –

+0

Eh bien, il ne doit pas être un espace comme délimiteur. Ce que je suggérais, c'est de ** attendre ** pour appliquer le style jusqu'à ce que le curseur soit à 'endOffset + 1', donc il y a quelque chose entre le curseur et la plage de texte. Donc, même après avoir tapé "SomeToken |' * * * juste * en tapant "n", le jeton n'est pas encore sélectionné. Mais, quand je tape le caractère * next *, SomeToken {| ', alors le jeton est trouvé et stylé quand j'entre" {"(ou n'importe quel autre caractère). J'ai remarqué que la coloration syntaxique fonctionne comme ça dans d'autres programmes. Désolé si je n'étais pas clair. J'espère que c'est plus clair. –

+0

Merci encore Benny.Ne vous inquiétez pas, vous étiez très clair. Ce que j'essayais d'éviter était une réinitialisation complète de la mise en forme sur chaque analyse mais je peux toujours voir des situations où le comportement de la RichTextBox quand elle hérite le formatage adjacent qui me causera des problèmes si je ne réinitialise pas complètement le formatage. Je suis sûr qu'il y aura un juste milieu. Merci, Alan –

Questions connexes