我正在添加一种新方法来区分程序中的用户权限。
这是一个小的圆形面板,显示在用户名之后,根据其权限更改颜色,并在用户缺口留出5像素间距后显示 :
private void SetNick(string nick)
{
this.NickLabel.Text = nick;
this.NickLabel.Left = ((this.ProfilePicturePanel.ClientSize.Width - this.NickLabel.Width) / 2) - 5;
Hector.Framework.Utils.Ellipse.Apply(this.BadgePanel, 6);
this.BadgePanel.Top = this.NickLabel.Top + 3;
this.BadgePanel.Left = this.NickLabel.Width + this.BadgePanel.Width + 5;
}
用户的昵称至少有3个字符,最多6个字符,当昵称有6个字符时(例如:Jhon S),面板正确对齐:
但如果昵称有3个字符(例如:Ben),则会发生这种情况:
假设面板应始终显示在标签附近,即使标签更改其内容,也会留出5个像素的空间。
你能告诉我我做错了吗?
答案 0 :(得分:2)
您可以覆盖Label Control并编写自己的实现,直接在Label中绘制徽章。这是一个简单的例子。
public class LabelWithBadge : Label
{
public Color BadgeColor { get; set; }
private Size BadgeSize { get; set; }
public LabelWithBadge()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
if (BadgeColor == null)
BadgeColor = Color.Red;
if (BadgeSize == null)
BadgeSize = new Size(20, 20);
}
protected override Size SizeFromClientSize(Size clientSize)
{
var textSize = TextRenderer.MeasureText("doesn't matter", this.Font);
this.BadgeSize = new Size(textSize.Height, textSize.Height);
var baseSize = base.SizeFromClientSize(clientSize);
return new Size(baseSize.Width + BadgeSize.Width, baseSize.Height);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.FillEllipse(new SolidBrush(this.BadgeColor), this.ClientSize.Width - this.BadgeSize.Width, 0, this.BadgeSize.Width, this.BadgeSize.Height);
}
}
通过覆盖SizeFromClientSize,您可以控制标签的AutoSize功能,并填充它以为徽章腾出空间。
如果您想支持徽章的手动调整大小,那么您需要调整此功能以关闭AutoSize。
然后我在控件上设置Styles来处理绘画。覆盖OnPaint允许您在SizeFromClientSize覆盖中绘制额外的填充。
我为徽章颜色添加了一个属性。徽章大小由使用TextRenderer.MeasureText的控件上的字体确定。因此,如果您将字体设置得更大,徽章就会变得更大。
此控件将在您构建时显示在工具箱中。然后你可以像任何其他标签一样使用它,但这个标签中有一个徽章。