2009-05-10 6 views
2

HI,Capture des traits du clavier en C#

J'ai le problème suivant: le texte suivant est dans une zone de texte enrichi.

Le monde est [[merveilleux]] aujourd'hui.

Si l'utilisateur fournit deux crochets avant et après un mot, comme dans le cas de merveilleux, le mot entre parenthèses, dans ce cas, merveilleux doit se transformer en un lien, (avec une couleur verte).

J'ai des problèmes pour obtenir la séquence des frappes, c.-à-d. comment puis-je savoir que l'utilisateur a entré [[, donc je peux commencer à analyser le reste du texte qui le suit. Je peux l'obtenir en remettant KeyDown, un événement, et une liste, mais il ne semble pas être élégant du tout.

S'il vous plaît laissez-moi savoir ce qui devrait être une bonne façon.

Merci, Sujay

Répondre

5

Vous avez deux approches que je peux penser à la main.

L'un d'entre eux est, comme vous le suggérez, de maintenir l'état actuel avec une liste: cette clé était-elle une parenthèse? était la dernière clé un support? -et mise à jour à la volée.

L'autre approche consisterait simplement à gérer l'événement TextChanged et à re-scanner le texte pour le motif [[text-here]] et à le mettre à jour selon les besoins.

La première nécessite plus de comptabilité mais sera beaucoup plus rapide pour les longs textes. La deuxième approche est plus facile et peut probablement être faite avec une regex correcte, mais elle deviendra plus lente à mesure que votre texte s'allonge. Si vous savez que vous avez une limite supérieure, comme 256 caractères, alors vous êtes probablement bien. Mais si vous attendez des romans, probablement pas une si bonne idée.

+0

Si les liens ne peuvent pas être multi-ligne (souvent le cas) vous don Vous n'avez pas besoin d'analyser toute la chaîne si vous conservez une copie de la chaîne stockée par des lignes. Ensuite, chaque ligne peut être analysée séparément et ne varie pas en fonction de la taille totale des chaînes. –

+0

J'ai déjà fait l'événement KeyDown et capturé les parenthèses, mais je ne pense pas que ce programme décent N'y at-il aucune approche avec des modèles de conception qui peuvent résoudre ce problème. E.g Je pense dans ce sens. Le [[merveilleux]] texte est un objet. Quand je rencontre les accolades, je le délègue à une fonction, disons SetFormatStyle (texte), qui fait le nécessaire. –

0

Garder une liste sera plutôt complexe je pense. Que faire si l'utilisateur tape un "[" caractère, clique ailleurs dans le texte et tape à nouveau un caractère "[". L'utilisateur a ensuite tapé deux '' caractères consécutifs mais dans des parties complètement différentes du texte. En outre, vous pouvez aussi être capable de gérer du texte inséré à partir du presse-papiers. Je pense que le moyen le plus sûr est d'analyser le texte intégral et de faire ce qui doit être fait à partir de ce contexte, en utilisant RegEx ou une autre technique.

1

Je voudrais essayer de gérer le KeyDown, et de vérifier la parenthèse fermante à la place "]". Une fois que vous en avez reçu un, vous pouvez vérifier le dernier caractère de votre boîte de texte pour la seconde], et si c'est le cas, remplacez simplement les derniers caractères.

Ceci élimine le besoin de maintenir l'état (ie: la liste). Dès que le second] a été tapé, le bloc se transformerait en lien instantanément.

2

Je vous recommande Google: "la syntaxe de surligneur de texttext", il y a tellement de gens qui l'ont fait, et il y a beaucoup de coulisses pour le faire fonctionner.

Je me permets de dire que CHAQUE solution simple SIMPLE présente des inconvénients majeurs. Le bon moyen serait d'utiliser un contrôle qui fait déjà cette "coloration syntaxique" et l'étendre à votre syntaxe. C'est aussi probablement le moyen le plus facile.

Vous pouvez rechercher des contrôles .net gratuits dans Codeplex.link

0

(Désolé, nous n'avons pas assez de réputation pour ajouter des commentaires, alors vous devez ajouter une nouvelle réponse). Comme je l'ai suggéré par jeffamaphone, je gérerais l'événement TextChanged et je ferais une nouvelle analyse du texte à chaque fois - mais pour garder le coût constant, il suffit d'analyser quelques caractères avant la position actuelle du curseur plutôt que de lire tout le texte.

Essayer d'intercepter les frappes et maintenir un état interne est une mauvaise approche - il est très facile pour votre idée de ce qui s'est passé de se désynchroniser avec le contrôle que vous surveillez et causer des problèmes étranges. (et comment gérez-vous les clics? Alt-tab? Pastes? touches flèches? Autre applicatiosn saisissant le focus? Trop de cas spéciaux à s'inquiéter de ...)