3

ほとんどのテキスト処理ツールに見られる機能である、winforms の複数行テキスト ボックスに、印刷できない文字 (スペース、改行) を表示しようとしています。

私はこれをやっています

textbox.Text.Replace(' ','·').Replace(Environment.NewLine, "¶" + Environment.NewLine);

これは今のところ問題なく動作しますが、スペースがないため、自動ワード ラップが機能しなくなりました。そのため、各行の長さを測定して単語の折り返しを手動で追加しようとしましたが、望ましい結果が得られません。

private int GetTextWidth(TextBox tb)
{
    using (var g = textBox1.CreateGraphics())
    {
        SizeF size = g.MeasureString(tb.Text, tb.Font);
        int width = (int)(size.Width + 0.5);
        return width;
    }
}

GetTextWidth は、文字ごとに異なる結果を返します。「l」の行を入力すると、GetTextWidth == textbox.Width が ~80% 後に到達し、「M」で GetTextWidth == textbox.Width の前でも改行が発生します。

等幅フォントの使用はオプションではありません。

4

2 に答える 2

2

あなたはZero width space

textbox.Text.Replace(" ","·\u200B")

改行を許可する必要がありますが、何のようにも見えません。バックスペース/削除は奇妙な動作をしているように見えるので、幅ゼロのスペースを表す a を削除しようとしていることを認識し.(またはその逆)、キーを 1 回押すだけで両方の文字を削除できることを認識する必要があります。

于 2012-11-09T15:52:31.457 に答える
0

このGraphics.MeasureString()方法は設計上不正確です。別の方法については、 MSDNライブラリページの備考セクションを参照してください。

于 2012-11-09T15:27:35.470 に答える