gpt4 book ai didi

c# - 向 C# winforms 控件添加徽章

转载 作者:行者123 更新时间:2023-12-05 08:27:51 25 4
gpt4 key购买 nike

当用 CSS 编写时,我可以添加一类“徽章”并获得我想要的东西。带有某种样式的按钮或选项卡附近的小数字,表明此控件具有需要审核的未决信息。

甚至还有一个帖子here有人试图在 iOS 上做我想做的事

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

这是一张图片,展示了我想要实现的目标:

Buttons and controls with badges

最佳答案

这是一种使用静态 Adorner 类的方法,非常快速但相当肮脏..

它可以为许多控件添加一个标签,它包括一个点击 Action 、动态文本并具有删除标签的代码。

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

这是 Adorner 类:

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 而是绘制区域,所以就像添加一个“close X”你必须user draw所有TabPages的徽章..

关于c# - 向 C# winforms 控件添加徽章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29756038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com