我使用的是带有许多ToolStrip的ToolStripButton。
我想要的是能够闪现其中一个按钮,以引起用户的注意。
例如,如果他们对信息进行了更改,并且需要单击保存按钮。
如果这是一个正常的按钮,我可以使用Timer并周期性地更改BackColor来实现这一点,但是这并不适用于ToolStrip。
我可以创建一个Renderer子类并将它分配给ToolStrip,但是这似乎只用于特定的情况--即它是事件驱动的。
有人有什么想法吗?
发布于 2012-08-02 12:07:26
那么,只需使用自定义渲染器,以便您可以更改按钮的背景颜色。有一个闪烁的计时器。向项目中添加一个新类并粘贴以下代码:
using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;
class BlinkingButtonRenderer : ToolStripProfessionalRenderer {
public BlinkingButtonRenderer(ToolStrip strip) {
this.strip = strip;
this.strip.Renderer = this;
this.strip.Disposed += new EventHandler(strip_Disposed);
this.blinkTimer = new Timer { Interval = 500 };
this.blinkTimer.Tick += delegate { blink = !blink; strip.Invalidate(); };
}
public void BlinkButton(ToolStripButton button, bool enable) {
if (!enable) blinkButtons.Remove(button);
else blinkButtons.Add(button);
blinkTimer.Enabled = blinkButtons.Count > 0;
strip.Invalidate();
}
protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) {
var btn = e.Item as ToolStripButton;
if (blink && btn != null && blinkButtons.Contains(btn)) {
Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size);
e.Graphics.FillRectangle(Brushes.Black, bounds);
}
else base.OnRenderButtonBackground(e);
}
private void strip_Disposed(object sender, EventArgs e) {
blinkTimer.Dispose();
}
private List<ToolStripItem> blinkButtons = new List<ToolStripItem>();
private bool blink;
private Timer blinkTimer;
private ToolStrip strip;
}包含按钮的工具箱中的表单中的示例用法:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
blinker = new BlinkingButtonRenderer(toolStrip1);
}
private void toolStripButton1_Click(object sender, EventArgs e) {
blink = !blink;
blinker.BlinkButton(toolStripButton1, blink);
}
private bool blink;
private BlinkingButtonRenderer blinker;
}https://stackoverflow.com/questions/11776057
复制相似问题