【发布时间】:2019-10-09 07:14:52
【问题描述】:
我正在尝试使用只读 RichTextBoxes 来显示用户生成的文本。文本框和控件的高度应取决于内容并限制在某个最大值,超过该点的任何内容都使用滚动条。
AutoSize 似乎不适用于 RTB
public void Rescale()
{
Point pt = rtbComment.GetPositionFromCharIndex(rtbComment.Text.Length);
int height = rtbComment.GetPositionFromCharIndex(rtbComment.Text.Length).Y + (int)rtbComment.SelectionFont.GetHeight();
if (height > 250)
height = 250;
this.Size = new System.Drawing.Size(616, height + 50);
rtbComment.Size = new System.Drawing.Size(614, height);
}
这对于短的 cmets 或带有少量文本和许多换行符的 cmets 非常有效,但对于分成 ~ 4 行的长单行,我从 GetPositionFromCharIndex 得到的点都是错误的 - 该函数将它放在 105px 的某个地方当它实际上接近 60 时,在 y 轴上向下,使文本框大约是预期大小的两倍。
这里的宽度似乎不是问题,因为该框以我设置的宽度开始并再次读取该点会产生相同的结果。
【问题讨论】:
-
在实际尝试渲染之前,您无法知道在特定页面上渲染时文本块的大小。 RTF 可以有不同的字体、大小、由连字符控制的换行等。您所说的换行符实际上可能是 段落,与换行生成的行有不同的间距
-
@PanagiotisKanavos 它什么时候尝试渲染呢?我指的是字符串中的实际换行符 (\n)
-
RTF(格式)没有
\n和RichTextBox converts newline characters to /par instead of /line -
在任何情况下,您都无法从特定控件轻松控制 form 的 布局。典型的方法是使用停靠或像TableLayoutPanel 这样的布局面板,在面板/容器上指定自动调整大小和最大大小并将控件设置为填充其单元格
-
您可以使用TextRenderer.MeasureText 来确定在特定大小的容器中呈现文本时的大小。如果宽度是固定的,提供一个特定宽度的容器(一个矩形),然后获取测量文本的高度并将其最小/最大到您预定义的最大高度。
标签: c# .net winforms richtextbox autosize