MarkDown#Editorを更新していて困った問題に遭遇。
Visual C# の RichTextEdit コンポーネントでは、英語なら、打ち込んだ文字がそのまま「確定」となりますが、日本語など2バイト文字はIME(FEP)を通して確定させます。
しかしながら、TextBox をはじめとした、RichTextEdit などは、キーを打ち込むたびに、TextChanged イベントが発生してしまう模様。
たしかに、独自にエディターを開発したり、日本語を含む多言語変換を開発したいという方には、この挙動でなくして、入力文字を取れません(KeyDownイベントや、KeyUpイベントなどで引っかけるという手もありますが)。
日本語サイトではなかなか解決できなかったのですが、以下の考察がたいへん参考になりました。
IMEで変換状態中でもTextBox.TextChangedが発生する – 泥庭
http://yone64.wordpress.com/2010/10/25/ime%E3%81%A7%E5%A4%89%E6%8F%9B%E7%8A%B6%E6%85%8B%E4%B8%AD%E3%81%A7%E3%82%82textbox-textchanged%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B/
テキストインプットするだけでも、TextChangedが複雑に発生しているんですね。図もちょーわかりやすい。
それ見て、なるほどー、うなりったり。
ただ、ここでは、System.Windows.Input.TextCompositionManagerクラスを使って解決を試みていますが、どうもTextCompositionManager.AddPreviewTextInputHandlerが、RichTextBoxをDependencyObjectとして認識してくれなくてうまくいかない(このページでの例はTextBoxクラスを使っている)。
うーん、こりゃ参ったぞ、と。
さらにググったりしてると、RichTextBoxの文字数を常に見ながら、キーが打ち込まれた回数を数え、一致したらTextChagendイベントを受け付ける、なんていう力技も散見したりして。
これもどうなんだろう・・・。文字数多くなってきたらちょいと面倒だぞ、と。
で、結局は、以下のサイトにどんぴしゃな質問と、回答のソースがあり、それを参考にして、RichTextEdit を独自に拡張する方法にしました。
Get text from richtextbox control without disturbing IME when input east Asian language
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/cefa5376-7912-47f6-b86a-197a211c2b70/
これを踏まえて、richEditBoxEx.csを改良。
詳しくは、GitHubにあるソースを参照ください。↓
まあ、改良、というかまんま頂いたんですけどね(笑)。
このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。
日々の開発作業で気づいたこと共有を。同じところで躓いている人が、 検索で辿り着けたら良いな、というスタンスで記事を書くので不定期更新になります。
コメントする