RichTextBox.PageWidth のサイズを 1 行あたり 60 文字 (固定幅フォント) に制限しようとしています。基本的に、文字列を測定してから、PageWidth を測定した量に設定します。
使用すると、測定値が 2 文字ずれます。(最後の 2 文字は次の行に折り返されます。)
RichTextBox に実際にそのテキストを入れずに、RichTextBox の文字列の幅を取得する方法について、誰もが知っている
文字列測定方法(ここから取得):
private static double GetStringWidth(string text,
FontFamily fontFamily,
double fontSize)
{
Typeface typeface = new Typeface(fontFamily,
FontStyles.Normal,
FontWeights.Normal,
FontStretches.Normal);
GlyphTypeface glyphTypeface;
if (!typeface.TryGetGlyphTypeface(out glyphTypeface))
throw new InvalidOperationException("No glyph typeface found");
double size = fontSize;
ushort[] glyphIndexes = new ushort[text.Length];
double[] advanceWidths = new double[text.Length];
double totalWidth = 0;
for (int n = 0; n < text.Length; n++)
{
ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[text[n]];
glyphIndexes[n] = glyphIndex;
double width = glyphTypeface.AdvanceWidths[glyphIndex] * size;
advanceWidths[n] = width;
totalWidth += width;
}
return totalWidth;
}
上記の方法の使用:
var strToMeasure="012345678901234567890123456789012345678901234567890123456789";
richTextBox.FontFamily = new FontFamily("Courier New");
var fontFamily = richTextBox.FontFamily;
var fontSize = richTextBox.FontSize;
var measuredWidth = GetStringWidth(strToMeasure, fontFamily, fontSize);
richTextBox.Document.PageWidth = measuredWidth;
richTextBox.Document.MaxPageWidth = measuredWidth;
richTextBox.Document.MinPageWidth = measuredWidth;
更新:
さらなるテストにより、常に2文字ずれていることが明らかになりました(4文字または100文字の場合)。これにより、RichTextBox が何かをパディングしていると思われます。