label 添加 Paint 事件。用"\n" 段落换行
private void label2_Paint(object sender, PaintEventArgs e){int LineDistance = 8;//行间距System.Windows.Forms.Label label = sender as System.Windows.Forms.Label;System.Drawing.Font drawFont = label.Font;label.AutoSize = false;SolidBrush drawBrush = new SolidBrush(label.ForeColor);Graphics g = e.Graphics;g.Clear(label.BackColor);StringFormat drawFormat = new StringFormat(); string[] arrDrawString = label.Text.Split(new char[] { '\n'});int height = 0;foreach (string str in arrDrawString){//文本的矩形区域大小SizeF textSize = g.MeasureString(str, label.Font);//计算行数int strLineCount = Convert.ToInt32(Math.Ceiling(textSize.Width / label.Width));height += Convert.ToInt16((textSize.Height + LineDistance) * strLineCount);}label.Height = height; //计算调整后的高度float netTextPos_Y = 0; // 下一行的位置foreach (string drawString in arrDrawString){bool drawText = false;int strLenght = 1; // 长度int startIndex = 0; // 开始位置for (int i = 0; i < drawString.Length; i++, strLenght++){string subN = drawString.Substring(startIndex, strLenght);if (startIndex + strLenght >= drawString.Length){drawText = true;}else{string subN1 = drawString.Substring(startIndex, strLenght + 1);if (g.MeasureString(subN, label.Font).Width <= label.Width && g.MeasureString(subN1, label.Font).Width > label.Width){drawText = true;}}if (drawText){drawText = false;strLenght = 0;startIndex = i + 1;SizeF textSize = g.MeasureString(subN, label.Font);e.Graphics.DrawString(subN, drawFont, drawBrush, 0, netTextPos_Y , drawFormat);netTextPos_Y = netTextPos_Y + textSize.Height + LineDistance;}}}}
效果图: