根据等宽字体的大小设置WPF RichTextBox的宽度和高度

zop*_*ope 4 c# wpf richtextbox monospace

我正在尝试使用WPF RichTextBox来精确地容纳特定等宽字体中的字符网格.我目前正在使用FormattedText来确定我的RichTextBox的宽度和高度,但它为我提供的测量值太小 - 特别是两个宽度太小的字符.

有没有更好的方法来执行此任务?这似乎不是确定我的控件大小的合适方法.

RichTextBox rtb;
rtb = new RichTextBox();
FontFamily fontFamily = new FontFamily("Consolas");
double fontSize = 16;
char standardizationCharacter = 'X';
String standardizationLine = "";
for(long loop = 0; loop < columns; loop ++) {
    standardizationLine += standardizationCharacter;
}
standardizationLine += Environment.NewLine;
String standardizationString = "";
for(long loop = 0; loop < rows; loop ++) {
    standardizationString += standardizationLine;
}
Typeface typeface = new Typeface(fontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal);
FormattedText formattedText = new FormattedText(standardizationString, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, fontSize, Brushes.Black);
rtb.Width = formattedText.Width;
rtb.Height = formattedText.Height;
Run Code Online (Sandbox Code Playgroud)

Mik*_*Two 6

假设你有一个非常基本RichTextBox的标准FlowDocument,那么你必须考虑所有额外的布局RichTextBox用途.

Document.PagePadding属性默认为{5,0,5,0}.所以你必须在宽度上加10.

此外,RichTextBox它具有BorderThickness默认值{1, 1, 1, 1}.所以你必须在宽度上加2.

所以你想要的代码看起来像:

var pagePadding = rtb.Document.PagePadding;
var borderThickness = rtb.BorderThickness;
rtb.Width = formattedText.Width
    + pagePadding.Left + pagePadding.Right 
    + borderThickness.Left + borderThickness.Right;
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你仍然会被1个字符关闭,但这有点误导.RichTextBox即使文本只是一小部分宽,而不仅仅是整个字符宽度,它将会换行.如果你在宽度上添加2就可以了.我无法确切知道额外的2来自哪里.我从未试图让宽度如此精确.我所遇到的PagePaddingBorderThickness之前的问题,但我只是找不到多余2.它可能就是你被卡住恒定的,但我对此表示怀疑.它必须在某个地方.

生产StandardizationLine你可以做的一个小技巧

string StandardizationLine = new string('X', columns);
Run Code Online (Sandbox Code Playgroud)

清理循环.