2

こんにちは、

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

今日の世界は[[素晴らしい]]です。

素晴らしいの場合のように、ユーザーが単語の前に2つの角かっこを付けて単語の後に付けると、角かっこで囲まれた単語(この場合)は、リンク(緑色)に変わります。

キーストロークのシーケンスを取得するのに問題があります。ユーザーが[[を入力したことをどのように知ることができるので、それに続く残りのテキストの解析を開始できます。

KeyDown、event、listを操作することで入手できますが、エレガントには見えません。

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

ありがとう、スジェイ

4

5 に答える 5

5

私がすぐに思いつくことができる2つのアプローチがあります。

1つは、あなたが提案するように、リストで現在の状態を維持することです—このキーはブラケットでしたか? 最後のキーはブラケットでしたか?—その場で更新します。

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

1 つ目はより多くの簿記を必要としますが、長いテキストの場合ははるかに高速になります。2 番目の方法はより簡単で、適切な正規表現を使用して実行できる可能性がありますが、テキストが長くなるにつれて遅くなります。256 文字などの上限があることがわかっている場合は、おそらく問題ありません。しかし、小説を期待しているのであれば、おそらくそれほど素晴らしいアイデアではありません.

于 2009-05-10T18:26:34.283 に答える
2

Google で検索することをお勧めします:「richtextbox シンタックス ハイライター」。これを行った人は非常に多く、それを機能させるために舞台裏で多くの作業が行われています。

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

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

于 2009-05-10T19:28:27.833 に答える
1

KeyDown を処理して、「]」の代わりに閉じ括弧をチェックしてみます。受け取ったら、テキスト ボックスの最後の文字で 2 番目の ] を確認し、そこにある場合は、最後の数文字を置き換えるだけです。

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

于 2009-05-10T18:31:54.463 に答える
0

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

最も安全な方法は、正規表現またはその他の手法を使用して、全文を分析し、そのコンテキストから行うべきことを行うことだと思います。

于 2009-05-10T18:31:49.113 に答える
0

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

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

于 2009-05-10T21:56:20.183 に答える