设置WPF RichTextBox的宽度和高度根据等宽字体的大小
-
24-09-2019 - |
题
我试图适应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;
解决方案
假设你有只是标准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;
如果你做,你仍然会关闭的1个字符,但是这是一个有点误导。该RichTextBox
将包装即使文本只是一点点宽而不是整个字符宽度。如果添加2的宽度它的作品了。其中,额外2是来自我无法弄清楚到底。我从来没有试图让宽度是如此精确。我以前也碰到PagePadding
和BorderThickness
的问题,但我只是找不到多余2.它可能就是你被卡住恒定的,但我对此表示怀疑。它在什么地方。
上产生StandardizationLine
小提示可以做
string StandardizationLine = new string('X', columns);
清理循环。
其他提示
我发现对于富文本框的高度的问题的解决方案..我已修改它用于一般用途..
创建以下在应用程序结构.... 强>
[StructLayout(LayoutKind.Sequential)]
public struct RECT {
public Int32 left;
public Int32 top;
public Int32 right;
public Int32 bottom;
}
[StructLayout(LayoutKind.Sequential)]
public struct SCROLLBARINFO {
public Int32 cbSize;
public RECT rcScrollBar;
public Int32 dxyLineButton;
public Int32 xyThumbTop;
public Int32 xyThumbBottom;
public Int32 reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public Int32[] rgstate;
}
创建按照您的类形式的私有变量(在任何你需要计算的富文本高度)
private UInt32 SB_VERT = 1;
private UInt32 OBJID_VSCROLL = 0xFFFFFFFB;
[DllImport("user32.dll")]
private static extern
Int32 GetScrollRange(IntPtr hWnd, UInt32 nBar, out Int32 lpMinPos, out Int32 lpMaxPos);
[DllImport("user32.dll")]
private static extern
Int32 GetScrollBarInfo(IntPtr hWnd, UInt32 idObject, ref SCROLLBARINFO psbi);
添加以下方法来你的类为形式强>
private int CalculateRichTextHeight(string richText) {
int height = 0;
RichTextBox richTextBox = new RichTextBox();
richTextBox.Rtf = richText;
richTextBox.Height = this.Bounds.Height;
richTextBox.Width = this.Bounds.Width;
richTextBox.WordWrap = false;
int nHeight = 0;
int nMin = 0, nMax = 0;
SCROLLBARINFO psbi = new SCROLLBARINFO();
psbi.cbSize = Marshal.SizeOf(psbi);
richTextBox.Height = 10;
richTextBox.ScrollBars = RichTextBoxScrollBars.Vertical;
int nResult = GetScrollBarInfo(richTextBox.Handle, OBJID_VSCROLL, ref psbi);
if (psbi.rgstate[0] == 0) {
GetScrollRange(richTextBox.Handle, SB_VERT, out nMin, out nMax);
height = (nMax - nMin);
}
return height;
}
您可能需要修改上述方法,使其按照您的要求工作... 确保发送RTF格式字符串作为参数传递给方法不正常的文字,也保证分配可用的宽度和高度RichTextBox的变量的方法......
您可以用自动换行根据您的要求发挥...