Синхронизация мигающих меток в C#

Я создал BlinkingLabelкласс, происходит от Forms.Label, который имеет Forms.Timer что позволяет мне включать и отключать эффект мигания.

Я создал 4 ярлыка BlinkingLabel типа, моя проблема в том, что если все 4 метки, где мигать в разное время, эффект мигания не синхронизируется.

Как я могу настроить свой дизайн таким образом, чтобы, даже если метки мигали в разное время, мигание было синхронизировано?

******* Отредактировано ****** Я добавил следующий код, но все равно не могу заставить метки 1 и 2 мигать одновременно. То, что я пытаюсь сделать, это проверить следующее: заставить мигать label1, затем я нажимаю кнопку, чтобы метка label 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();

    }

2 ответа

Решение

Вам нужно использовать только один таймер и заставить его мигать всеми метками. Это наиболее элегантно сделано путем создания компонента, который реализует интерфейс IExtenderProvider. Подобно тому, как работает ErrorProvider, я покажу вам тот, который добавляет свойство Blink к каждому элементу управления Label в форме.

Добавьте новый класс в ваш проект и вставьте код, показанный ниже. Компиляция. Перетащите новый компонент из верхней части панели инструментов на форму. Установите свойство 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>();
}

Они меняют цвет одновременно, но они не синхронизируются. синхронизировать их и использовать тот же цвет. Вы должны изменить код так, чтобы цвет мигания сохранялся таймером, или элемент управления, а не метки, пытались сделать что-то подобное

 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);
    }
Другие вопросы по тегам