C'est très facile en utilisant deux zones de texte superposées. L'arrière est une zone de texte normale avec un padding supplémentaire et du texte transparent. L'avant a vos caractères supplémentaires mais a ses bordures cachées et IsHitTestVisible=False
et Focusable=False
donc il n'interagit pas avec l'utilisateur. L'utilisateur interagit exclusivement avec la zone de texte arrière mais la zone de texte avant est celle qui affiche le texte. Une liaison avec un convertisseur de valeur fait en sorte que la zone de texte avant affiche exactement ce que la zone de texte arrière affiche, plus les caractères supplémentaires.
Voici à quoi cela ressemblerait :
ExtraCharacterConverter est une simple classe IValueConverter
qui implémente la méthode Convert
en prenant la chaîne donnée, en y ajoutant des guillemets ou des // ou tout ce que vous voulez, et en retournant le résultat.
Notez que j'ai codé en dur une marge à gauche et à droite de 10 unités sur la zone de texte arrière, ce qui suppose une largeur particulière pour les caractères ajoutés. Cela doit être exactement la largeur des caractères ajoutés pour que le texte s'aligne correctement. Vous voulez que cela soit correct, sinon votre curseur et la position de la sélection de texte seront incorrects. Notez également que la valeur correcte changera lorsque vous modifierez votre taille de police et votre choix de caractères supplémentaires.
Une alternative facile au codage en dur de la marge serait de la définir comme une multi- liaison sur FontSize, FontFamily, FontWeight
, etc., puis d'utiliser un IMultiValueConverter
pour calculer la marge appropriée en fonction de ces valeurs.
Remarque : cette solution est légèrement insatisfaisante en ce qui concerne le schéma de couleurs pour la sélection de texte. Cela peut être corrigé, mais cela nécessite une solution plus complexe : la zone de texte arrière est la même mais son texte n'est pas invisible. La zone de texte avant est remplacée par un RichTextBox (ou TextBlock) dont le contenu est calculé dynamiquement pour être le texte avec des caractères supplémentaires, mais le texte régulier est transparent. Parce que c'est un RichTextBox, les caractères supplémentaires peuvent être visibles alors que les autres sont transparents.