2009-05-10 3 views
2

HI、キーボードストロークをC#でキャプチャする

次のテキストはリッチテキストボックスにあります。

今日は世界が[すばらしい]です。

ユーザーが2つの角括弧を前に付けると、素晴らしい場合のように、角括弧内の単語(この場合はすばらしい)がリンク(緑色)に変わります。

私は、キーストロークのシーケンスを取得する際に問題があります。ユーザーが[[[、だから、それに続くテキストの残りの部分を解析することができます。

KeyDown、イベント、およびリストを手作業で取得できますが、エレガントではありません。

適切な方法を教えてください。

おかげで、 Sujay

答えて

5

あなたは私がオフに手を考えることができる2つのアプローチがあります。

あなたがお勧めするように、リストを使って現在の状態を維持することは、このキーがかっこでしたか?最後のキーはカッコで、飛行中に更新されましたか?

もう1つの方法は、単にTextChangedイベントを処理し、[[text-here]]パターンのテキストを再スキャンし、必要に応じて更新することです。

最初のものはより多くの簿記を必要としますが、長いテキストの方がはるかに速くなります。 2番目のアプローチは簡単ですし、まともな正規表現で行うこともできますが、テキストが長くなるほど遅くなります。あなたが256文字のようないくつかの上限を持っていることを知っているなら、あなたは大丈夫でしょう。しかし、あなたが小説を期待しているのであれば、それほど素晴らしいアイデアではないでしょう。

+0

リンクが複数行行によって格納された文字列のコピーを保持している場合は、文字列全体をスキャンする必要はありません。各行は別々に解析することができ、文字列の合計サイズによって縮尺変更されません。 –

+0

私はすでにKeyDownイベントを実行し、角かっこをキャプチャしましたが、それはまともなプログラミングとは思わないです この問題を解決できるデザインパターンはありません。 例:私はこの行で考えています。 [[すばらしい]]テキストはオブジェクトです。中括弧に遭遇すると、それを必要な機能を果たすSetFormatStyle(テキスト)に委譲します。 –

0

リストを維持することはやや複雑だと思います。ユーザーが '['文字を入力して、テキスト内の他の場所をクリックし、 '['文字をもう一度入力するとどうなりますか?ユーザーは2つの連続した '['文字を入力しましたが、テキストの完全に異なる部分に入力しました。また、クリップボードから挿入されたテキストも処理できるようにすることができます。

私は最も安全な方法は、完全なテキストを分析し、RegExまたは他の技術を使用して、そのコンテキストから何をすべきかを行うことだと思います。

1

私はKeyDownを処理して、代わりに "]"の閉じ括弧をチェックしようとします。一度受け取ったら、テキストボックスの最後の文字を2番目の文字でチェックして、それがあれば最後の数文字を置き換えます。

これにより、状態(つまり、リスト)を維持する必要がなくなります。すぐに2番目の文字が入力されると、ブロックはすぐにリンクに変わります。

2

Googleでは「richtextbox syntax highlighter」をお勧めします。これを行った人が非常に多く、背後にはたくさんの機能があります。

私は自分自身を敢えて言えば、すべてのシンプルなソリューションには大きな欠点があります。適切な方法は、すでにこの「構文の強調表示」を行い、それを構文に拡張するコントロールを使用することです。また、最も簡単な方法です。

Codeplexで無料の.netコントロールを検索できます。link

0

(申し訳ありませんが、コメントを追加するには十分な評判がないので、新しい回答を追加する必要があります)。 jeffamaphoneが提案したように、私はTextChangedイベントを処理して毎回テキストを再スキャンしますが、コストを一定に保つために、テキスト全体を読むのではなく、現在のカーソル位置より先に数文字をスキャンします。

キーストロークを傍受して内部状態を維持しようとするのは悪いアプローチです。監視しているコントロールと同期が外れて奇妙な問題が発生するのはあなたの考えに非常に簡単です。 (そして、どのようにしてクリックを処理するのですか?Alt-tab?ペーストする矢印キー?他のアプリケーションのフォーカス?心配する特別なケースが多すぎます...)

関連する問題