在 C# 中同步闪烁标签

Sync Blinking Labels in C#

我创建了一个 BlinkingLabelclass,派生自 Forms.Label,它有一个 Forms.Timer 允许我启用和禁用闪烁效果。

我创建了 4 个 BlinkingLabel 类型的标签,我的问题是如果所有 4 个标签在不同时间闪烁,闪烁效果不同步。

如何调整我的设计,即使标签在不同时间闪烁,闪烁也会同步?

******* 已编辑****** 我添加了以下代码,但仍然无法让标签 1 和 2 同时闪烁。我想做的是测试以下内容:让 label1 闪烁然后我单击按钮使标签 2 闪烁并且它们不同步。

知道哪里做错了吗?

public partial class UserControl1 : UserControl
{
    Timer blinkTimer;
    Color blinkingColor = Color.Red;
    int interval = 300;

    bool flag1 = false;
    bool flag2 = false;

    public UserControl1()
    {
        InitializeComponent();      // Blinking abel default values
        this.blinkTimer = new Timer();
        this.blinkTimer.Interval = interval; ;
        this.blinkTimer.Tick += new System.EventHandler(timer_Tick);
        flag1 = true;
        this.blinkTimer.Start();
    }

    private void blinkLabels(Label label)
    {
        if (label.ForeColor == Color.White)
            label.ForeColor = blinkingColor;
        else
            label.ForeColor = Color.White;
    }

    void timer_Tick(object sender, System.EventArgs e)
    {
        if(flag1 == true)
            blinkLabels(label1);
        if(flag2 == true)
            blinkLabels(label2);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        flag2 = true;
        this.blinkTimer.Start();

    }

它们确实会同时改变颜色,但不是,但它们不同步。 同步它们并使用相同的颜色。您必须更改代码,以便计时器或控件而不是标签保留闪烁颜色 尝试这样的事情

 Color currentBlink;     
 private void blinkLabels(Label label)
 {
            label.ForeColor = currentBlink;        
 }

 void timer_Tick(object sender, System.EventArgs e)
    {
        if (currentBlink== Color.White)
            currentBlink = blinkingColor;
        else
            currentBlink = Color.White;


        if(flag1 == true)
            blinkLabels(label1);
        if(flag2 == true)
            blinkLabels(label2);
    }

您只需要使用 一个 计时器并使其闪烁 所有 标签。最优雅的做法是创建一个实现 IExtenderProvider 接口的组件。与 ErrorProvider 的工作方式类似,我将向您展示一个向表单上的每个 Label 控件添加 Blink 属性 的方法。

向您的项目添加一个新的 class 并粘贴如下所示的代码。编译。将新组件从工具箱顶部拖放到您的窗体上。将 Blink 属性 设置为任何需要闪烁为 True 的标签。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

[ProvideProperty("Blink", typeof(Label))]
public class BlinkProvider : Component, IExtenderProvider {
    public BlinkProvider() {
        timer = new Timer();
        timer.Tick += timer_Tick;
        Interval = 500;
        Enabled = true;
        BlinkingColor = Color.Red;
    }
    public BlinkProvider(IContainer container)
        : this() {
        container.Add(this);
    }

    protected override void Dispose(bool disposing) {
        if (disposing) timer.Dispose();
        base.Dispose(disposing);
    }

    [DefaultValue(500)]
    public int Interval {
        get { return timer.Interval; }
        set { timer.Interval = value; }
    }

    [DefaultValue(true)]
    public bool Enabled { get; set; }

    [DefaultValue(typeof(Color), "255, 255, 0, 0")]
    public Color BlinkingColor {
        get;
        set;
    }

    private void timer_Tick(object sender, EventArgs e) {
        if (this.DesignMode) return;
        tock = !tock;
        foreach (var lbl in labels.Keys) {
            if (labels[lbl].Blink && Enabled && tock) lbl.ForeColor = BlinkingColor;
            else lbl.ForeColor = labels[lbl].ForeColor;
        }
    }

    bool IExtenderProvider.CanExtend(object extendee) {
        return extendee is Label;
    }
    public bool GetBlink(Label label) {
        AddLabelIfNecessary(label);
        return labels[label].Blink;
    }
    public void SetBlink(Label label, bool blink) {
        AddLabelIfNecessary(label);
        labels[label].Blink = blink;
    }
    private void AddLabelIfNecessary(Label label) {
        if (!labels.ContainsKey(label)) {
            labels.Add(label, new BlinkInfo { Blink = false, ForeColor = label.ForeColor });
        }
        timer.Enabled = !DesignMode;
    }

    private Timer timer;
    private bool tock;
    private class BlinkInfo {
        public Color ForeColor;
        public bool Blink;
    }
    private Dictionary<Label, BlinkInfo> labels = new Dictionary<Label, BlinkInfo>();
}