Синхронизация мигающих меток в 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);
}