将徽章添加到C#winforms控件

在CSS中编写时,我可以添加一类“徽章”并获得我想要的内容。 一个带有一些样式的按钮或标签附近的小数字,表示此控件具有需要查看的待处理信息。

甚至有人试图在iOS上做我想做的事情

我想在按钮或选项卡上的WinForms上执行此操作。 如果WPF中有更简单的解决方案,那么我可能会考虑使用它。

这是一个显示我想要实现的示例的图像:

带徽章的按钮和控件

这是静态Adorner类的一种方式,非常快速而且相当脏。

它可以为许多控件添加一个Label,它包含一个单击操作,动态文本,并具有删除Label的代码。

一个装饰按钮

向Button添加徽章需要一行:

  public Form1() { InitializeComponent(); // adorn one Button with a Badge Label: Adorner.AddBadgeTo(button1, "123"); // if you want to you can add a click action: Adorner.SetClickAction(button1, dobidoo); } // a test action void dobidoo(Control ctl) { Console.WriteLine("You have clicked on :" + ctl.Text); } 

这是Adorner类:

 static class Adorner { private static List controls = new List(); static public bool AddBadgeTo(Control ctl, string Text) { if (controls.Contains(ctl)) return false; Badge badge = new Badge(); badge.AutoSize = true; badge.Text = Text; badge.BackColor = Color.Transparent; controls.Add(ctl); ctl.Controls.Add(badge); SetPosition(badge, ctl); return true; } static public bool RemoveBadgeFrom(Control ctl) { Badge badge = GetBadge(ctl); if (badge != null) { ctl.Controls.Remove(badge); controls.Remove(ctl); return true; } else return false; } static public void SetBadgeText(Control ctl, string newText) { Badge badge = GetBadge(ctl); if (badge != null) { badge.Text = newText; SetPosition(badge, ctl); } } static public string GetBadgeText(Control ctl) { Badge badge = GetBadge(ctl); if (badge != null) return badge.Text; return ""; } static private void SetPosition(Badge badge, Control ctl) { badge.Location = new Point(ctl.Width - badge.Width - 5, ctl.Height - badge.Height - 5); } static public void SetClickAction(Control ctl, Action action) { Badge badge = GetBadge(ctl); if (badge != null) badge.ClickEvent = action; } static Badge GetBadge(Control ctl) { for (int c = 0; c < ctl.Controls.Count; c++) if (ctl.Controls[c] is Badge) return ctl.Controls[c] as Badge; return null; } class Badge : Label { Color BackColor = Color.SkyBlue; Color ForeColor = Color.White; Font font = new Font("Sans Serif", 8f); public Action ClickEvent; public Badge() {} protected override void OnPaint(PaintEventArgs e) { e.Graphics.FillEllipse(new SolidBrush(BackColor), this.ClientRectangle); e.Graphics.DrawString(Text, font, new SolidBrush(ForeColor), 3, 1); } protected override void OnClick(EventArgs e) { ClickEvent(this); } } } 

请注意,虽然您可以将它添加到大多数控件,但不是所有工作都与Button 。 一个TabControl很难装饰,因为它的Tabs实际上不是Controls而只是绘制区域,所以就像添加一个’close X’一样,你必须user draw所有TabPages的徽章。

真正实现这一目标的最简单,最好的方法是创建一个新的自定义UserControl 。 只需添加一个按钮,然后在右侧插入一个标签即可。 然后为新UserControl的控件添加getterssetters 。 这是一个get / set配置按钮通知的示例:

 public String ButtonNotification { get { return yourUserControlLabel.Text; } set { if (value == null || value == "") { yourUserControlLabel.Visibility = Hidden; } else { yourUserControlLabel.Visibility = Visible; } yourUserControlLabel.Text = value; } } 

然后,您可以使用getter / setter自定义标签的可见性和其他属性。

以下是使用UserControl执行此操作的粗略方法:

 public partial class btnControl : UserControl { public Label label = new Label(); public TextBox box = new TextBox(); public btnControl() { this.label = new System.Windows.Forms.Label(); this.box = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // label // this.label.AutoSize = true; this.label.ForeColor = System.Drawing.Color.White; this.label.Location = new System.Drawing.Point(4, 7); this.label.Name = "label"; this.label.Size = new System.Drawing.Size(35, 13); this.label.TabIndex = 0; this.label.Text = "label"; // // box // this.box.Location = new System.Drawing.Point(110, 3); this.box.Name = "box"; this.box.Size = new System.Drawing.Size(31, 20); this.box.TabIndex = 1; this.box.Enabled = false; // // btnControl // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.Blue; this.Controls.Add(this.box); this.Controls.Add(this.label); this.Name = "btnControl"; this.Size = new System.Drawing.Size(144, 26); this.ResumeLayout(false); this.PerformLayout(); } } 

然后把它放在你的表格中:

 private void Form1_Load(object sender, EventArgs e) { btnControl Control = new btnControl(); this.Controls.Add(Control); Control.label.Text = "Home"; Control.box.Text = "42"; } 

给你:

在此处输入图像描述