Flashing ToolStripButton

别来无恙 提交于 2019-12-21 21:41:33

问题


I am using a ToolStrip with a number of ToolStripButtons.

What I would like is to be able to flash one of the buttons to get the user's attention.

For example, if they have made changes to information and need to click the Save button.

If this were a normal button I could do this using a Timer and periodically changing the BackColor however this doesn't work with a ToolStrip.

I could create a Renderer subclass and assign it to the ToolStrip but this appears to only get used in specific situations - i.e. it's event driven.

Does anyone have any ideas?


回答1:


Well, just use a custom renderer so you can change the color of the button's background. With a timer that blinks it. Add a new class to your project and paste this code:

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

Sample usage in a form with a Toolstrip containing a button:

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/flashing-toolstripbutton

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!