森理 麟(moririring)のプログラマブログ

ゲームプログラマ森理 麟がのプログラムの話題を中心に書くブログです。

C#のテキストボックスを読み取り専用で使うのであればWebBrowserが一番良いかも

C#の弱点の一つはTextBoxだと思います。1行テキストボックスなら問題ありません。

しかし、メモとして複数行にした時はかなり使い勝手が悪いです。

例えばUndoはあるけれど、Redoはありません。Alt + Aで全選択できません。

細かく見ていくとかなり機能としては少ないです。例えばShiftを押して一行全選択した状態から更に↓キーを押しても無視されます。


これのもう少しマシなのがRichTextBoxです。

RedoやAlt + Aの全選択もあります。複数行にする時はこちらの方がおススメです。

また文字に色を付けたり、太字にしたりといったことも可能です。

ただ出来るというだけで、ググってもあまり情報でないし、決して使いやすくはありません。

また細かい機能もちょくちょく足りません。


森理は、読み取り専用テキストは今までのRichTextBoxをEnabled = falseで使っていました。

しかし、読み取り専用なら圧倒的にWebBrowserが優れていることに気付きました。

太字や色がタグで手軽に実装出来ます。細かい機能もちょくちょくあり、例えばCtrl + Fで検索も出来ます。

あと今回採用した理由としてハイパーリンクが使えます。これはRichTextBoxでは不可能でした(多分)。


実装方法としては書き換えたものをリアルタイムにhtmlファイルに書きだして、それをWebBrowserでNavigateします。

ファイル書き出しだと重いかとも思ったのですが、クリックしたら書き換えるでほぼリアルタイムでした。

初回書き出しだけちょっと重い時(1秒とか?)もありますが、2回目以降は軽くなります。

少しはまった点はNavigateはファイルパスに相対パスが使えません。実行ファイルと同じ場所にlayout.htmlを置いても絶対パスにする必要があります。

string layoutFile = Path.Combine(Path.GetFullPath(Path.GetDirectoryName(Application.ExecutablePath)), "layout.html");
System.IO.File.WriteAllText(layoutFile, strHtml, System.Text.Encoding.GetEncoding("shift_jis"));
webBrowser1.Navigate(layoutFile);