与标签有关的面板对齐错误

时间:2018-04-14 05:32:24

标签: c# winforms alignment

我正在添加一种新方法来区分程序中的用户权限。

这是一个小的圆形面板,显示在用户名之后,根据其权限更改颜色,并在用户缺口留出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),面板正确对齐:

enter image description here

但如果昵称有3个字符(例如:Ben),则会发生这种情况:

enter image description here

假设面板应始终显示在标签附近,即使标签更改其内容,也会留出5个像素的空间。

  

你能告诉我我做错了吗?

1 个答案:

答案 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的控件上的字体确定。因此,如果您将字体设置得更大,徽章就会变得更大。

此控件将在您构建时显示在工具箱中。然后你可以像任何其他标签一样使用它,但这个标签中有一个徽章。

LabelWithBadge Screenshot