描述:自定义了一个userControl,名为RichTextBoxName(这只是个名字,不是RichTextBox控件),在这个userControl里添加了一个RichTextBox控件,然后在其他控件需要显示这个userControl,希望richtextbox的高度可以根据内容自适应。
思路:先获得richtextbox的高度,然后调整userControl的高度。
这里需要把richtextbox的anchor设好,usercontrol高度变化的时候里面的richtextbox需要跟着变化
获得richtextbox的高度,需要知道它里面的内容,计算出一共有几行,然后用每一行的高度乘以行数就是richtextbox的高度了。
一开始我存的是字符串,根本get不到行数,永远都是一行。所以需要在字符串中加入分隔符,这样就知道有几行了。然后获得每一行的高度,把第一行和第二行的位置都得到,相减就是一行的高度。
代码:
userControl(RichTextBoxName)中定义一个外部可以调用的属性,这样获得内容就可以开始计算高度了;
public string Content
{
set
{
richTextBox1.Text = value;
int i = richTextBox1.Lines.Count(); //行数
System.Drawing.Point ptLine1 //第一行第一个字节的坐标
= richTextBox1.GetPositionFromCharIndex(richTextBox1.GetFirstCharIndexFromLine(0));
if (i > 1) 如果不止一行
{
System.Drawing.Point ptLine2 //第二行第一个字节的坐标
= richTextBox1.GetPositionFromCharIndex(richTextBox1.GetFirstCharIndexFromLine(1));
int TextLineHeight = ptLine2.Y - ptLine1.X; //每一行高度
this.Height = i * TextLineHeight;
}
}
}
后来我把这个方法放进项目工程里的时候发现,我的字符串里没有办法保存换行字符,所以行数还是要自己计算。后来我找到了一个方法GetLineFromCharIndex(int index),可以获得索引值位置所在的行数:
int i = richTextBox1.GetLineFromCharIndex(richTextBox1.Text.Length);
这样就知道了最后一个字符所在行数,也就是所有的行数。
我真聪明!