2015-04-20 66 views
0

当CSS写,我可以添加一个类“徽章”,并得到我想要的东西。靠近按钮或标签附近的一小部分样式,以显示此控件具有需要审阅的待处理信息。徽章添加到C#的WinForms控制

甚至还有人试图做我想要iOS上

什么,我想这样做对的WinForms在任一按钮或选项卡后here。如果WPF中提供了更简单的解决方案,那么我可能会考虑使用它。

这是表示什么,我想实现一例的印象:

Buttons and controls with badges

+3

'伊恩简单的解决方案是在WPF提供我可能会考虑使用instead.' - 当然,是的WinForms完全无用,不支持什么。你有什么尝试? –

+3

@HighCore你不觉得你对winforms的“无用”感到厌倦吗? – Eminem

+1

@Eminem no。一点也不。无论你在的WinForms实现,我可以实现在WPF同样用30%的精力和代码,并用更大的可扩展性,可定制性,和适当的分离量。 winforms是无用的。 –

回答

4

这里是一个静态的装饰器类,非常快,而肮脏的方式..

它可以添加标签许多控件,它包括点击动作,动态文本和具有代码删除标签。

an adorned 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); 
    } 

这里是装饰器类:

static class Adorner 
{ 
    private static List<Control> controls = new List<Control>(); 

    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<Control> 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<Control> 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只是漆面上,所以就像添加一个“关闭X”它,你将不得不user draw所有TabPages的徽章..

0

这里是一个粗略的方式与用户控件来做到这一点:

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"; 
     } 

给您:

enter image description here

3

真的最简单,达到此目的的最佳方法是创建一个新的自定义UserControl。只需添加一个按钮并在右侧插入一个标签即可。然后加入getterssettersUserControl里面你的控件。这里的/ GET的一个例子设置来配置按钮的通知:

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

     yourUserControlLabel.Text = value; 
    } 
} 

然后,你可以自定义标签的可见性和其他性能与getter/setter方法。