2

私はToolStripいくつかのToolStripButtonsを使用しています。

私が欲しいのは、ユーザーの注意を引くためにボタンの1つを点滅させることができることです。

たとえば、情報に変更を加え、[保存]ボタンをクリックする必要がある場合です。

これが通常のボタンの場合、を使用しTimerて定期的に変更することでこれを行うことができますが、BackColorこれはでは機能しませんToolStrip

Rendererサブクラスを作成して割り当てることもできますToolStripが、これは特定の状況でのみ使用されるようです。つまり、イベント駆動型です。

誰かアイデアはありますか?

4

1 に答える 1

6

ボタンの背景の色を変更できるように、カスタムレンダラーを使用するだけです。それを点滅させるタイマー付き。プロジェクトに新しいクラスを追加し、次のコードを貼り付けます。

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;
}
于 2012-08-02T12:07:26.860 に答える