winform控件中的Label控件设置AutoSize,Size 和MaximumSize属性可以实现自动换行,但有时我们需要达不到字数时就换行,这样的话,这种方法就不能实现了。
此处使用Panel控件,继承出一个AutoSplitLineLabel控件,实现自动换行。
封装的代码如下:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace sanda
{
/// <summary>
/// 可以自动换行的label
/// 换行符为 \r\n
/// </summary>
public class AutoSplitLineLabel : Panel
{
public string[] NewLine { get; set; } = new string[] { @"\r\n" };
public string[] _splitedLines { get; set; }
public string TextContent { get; set; }//此控件未分隔的文本
private Brush _brush = null;//字体画刷
private Color FontColor;//记录字体颜色
#region constructor
public AutoSplitLineLabel() : base()
{
TextContent = "";
FontColor = ForeColor;
_brush = new SolidBrush(FontColor);
}
#endregion
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (TextContent == "") return;
var g = e.Graphics;
//不同说明颜色已经ForeColor发生改变
//此时重新定义_brush
if (FontColor != ForeColor)
{
FontColor = ForeColor;
_brush.Dispose();
_brush = new SolidBrush(FontColor);
}
if (TextContent.Contains(NewLine[0]))//有分行符
{
_splitedLines = TextContent.Split(NewLine,StringSplitOptions.None);
SizeF TextSize = g.MeasureString(TextContent, Font);
int baseY = (Height - (((int)TextSize.Height) * _splitedLines.Length))/2;
for (int i = 0; i < _splitedLines.Length; i++)
{
TextSize = g.MeasureString(_splitedLines[i], Font);
int x = (Width - (int)TextSize.Width) / 2;
int y = baseY + (int)TextSize.Height * i;
g.DrawString(_splitedLines[i], Font, _brush, x, y);
}
}
else //一共 一行
{
SizeF TextSize = g.MeasureString(TextContent, Font);
int x = (Width - (int)TextSize.Width) / 2;
int y = (Height - (int)TextSize.Height) / 2;
g.DrawString(TextContent, Font, _brush, x, y);
}
}
}
}
写完代码后,编译一下,就可以在工具箱中找到这个控件了,拖到界面上,打开属性,设置TextContent的值,就行了。_
通过设置分行符,就可以达到换行的目的,
例如:TextContent=“6666”;此时就是一行显示
通过设置TextContent=“66666\r\n77777\r\n997”; 就可以自动换行
写在最后:
虽然实现了自动换行,但没有实现TextAlign等属性,默认的居中显示,如果有别的需求,可自行修改。