C# 自动缩放文本框

C# 自动缩放文本框,c#,.net,winforms,richtextbox,autosize,C#,.net,Winforms,Richtextbox,Autosize,我尝试使用只读RichTextBox来显示用户生成的文本。文本框和控件的高度应取决于内容,并限制在某个最大值,超过该值的任何内容都使用滚动条 自动调整大小似乎不适用于RTB public void Rescale() { 点pt=rtbComment.GetPositionFromCharIndex(rtbComment.Text.Length); int height=rtbComment.GetPositionFromCharIndex(rtbComment.Text.Length).Y+(

我尝试使用只读RichTextBox来显示用户生成的文本。文本框和控件的高度应取决于内容,并限制在某个最大值,超过该值的任何内容都使用滚动条

自动调整大小似乎不适用于RTB

public void Rescale()
{
点pt=rtbComment.GetPositionFromCharIndex(rtbComment.Text.Length);
int height=rtbComment.GetPositionFromCharIndex(rtbComment.Text.Length).Y+(int)rtbComment.SelectionFont.GetHeight();
如果(高度>250)
高度=250;
该尺寸=新系统图纸尺寸(616,高度+50);
rtbComment.Size=新系统图纸尺寸(614,高度);
}
这对于短注释或带有少量文本和许多换行符的注释来说绝对有效,但是对于被分成4行的长单行,我从GetPositionFromCharIndex得到的点是完全错误的-函数将它放在y轴上105px的某个位置,而实际上它接近60,使文本框的大小达到预期的两倍

这里的宽度似乎不是问题,因为框以我设置的宽度开始,再次读取指出的点会产生相同的结果。

已解决

我用了这个方法

由于此方法忽略了一个事实,即很长的行将在RichTextBox中接收一个或多个自动换行符,因此我编写了一个函数,通过换行符手动将文本拆分为任意长度的行,然后测量每一行,以检查它将在RTB中使用多少行

以下是功能,以防任何人需要它:

public int getLines(字符串注释)
{
整数高度_ln=0;
字符串[]行;
//基于换行符拆分为行
if(comment.Contains(“\n”))
{
lines=comment.Split('\n');
}
其他的
{
行=新字符串[1];
行[0]=注释;
}
//检查每一行,看看它是否会收到自动换行
foreach(行中的字符串行)
{
int text_width=TextRenderer.MeasureText(line,rtbcommentar.Font).width;
double text_lines_raw=(double)text_width/1400;//1400是我的RichTextBox的宽度
int text_line=0;
如果(line.Contains(“\r”)//请不要就此给我打电话,我已经感觉脏了
text\u lines=(int)Math.Floor(text\u lines\u raw);
其他的
文本线=(int)数学天花板(文本线原始);
如果(文本行==0)
text_line++;
高度\ ln+=文本\行;
}
return height_ln;//这是所需的行数,要调整RichTextBox的高度,我需要将其乘以15,这是字体的高度。
}

WinForm RichtextBox公开了,当与结合时,允许自动调整控件大小

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        rtbComment.MinimumSize = new Size(250, 200);
        rtbComment.MaximumSize = new Size(250, 400);
        rtbComment.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
        rtbComment.ContentsResized += rtbComment_ContentResized;

    }

    private void rtbComment_ContentResized(object sender, ContentsResizedEventArgs e)
    {
        rtbComment.Size = e.NewRectangle.Size;
    }
}

在实际尝试渲染之前,您无法知道在特定页面上渲染时文本块的大小。RTF可以有不同的字体、大小、由连字符控制的换行符等。您所谓的换行符实际上可能是与行生成的行具有不同间距的段落wrapping@PanagiotisKanavos但是,它何时尝试渲染?我指的是字符串(\n)RTF(格式)中的实际换行符没有
\n
和RichTextBox。在任何情况下,您都无法从特定控件轻松控制窗体的布局。典型的方法是使用停靠或布局面板,例如,在面板/容器上指定自动调整大小和最大大小,并将控件设置为填充其单元格。当在特定大小的容器中渲染时,可以使用该控件确定文本的大小。如果宽度是固定的,请提供一个特定宽度的容器(矩形),然后获取测量文本的高度,并将其最小/最大值设置为预定义的最大高度。TextRenderer不会忽略所有换行符(强制换行或由换行确定)。不过,您需要指定正确的TextFormat标志。使用以下命令:
var flags=TextFormatFlags.leftandrighpadding | TextFormatFlags.Top | TextFormatFlags.Left | TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak。在
TextRenderer.MeasureText()
中,使用允许
idevicontext
TextFormatFlags
参数的重载<可以使用
Control.CreateGraphics()
(在之后处理图形对象)生成code>idevicontext
,而不使用
TextFormatFlags.WordBreak,例如,它将测量文本在单行中的布局。您还需要指定容器的大小。对此参数使用
新大小(Control.ClientSize.Width,MaxHeight)
。以这种方式测量时,TextRenderer将返回指定容器边界内文本的正确大小。