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等屬性,默認的居中顯示,如果有別的需求,可自行修改。