2015-05-07 82 views
8

Ho creato una classe BlinkingLabel, deriva da Forms.Label, che ha un Forms.Timer che mi consente di abilitare e disabilitare l'effetto lampeggiante.Etichette lampeggianti di sincronizzazione in C#

Ho creato 4 etichette del tipo BlinkingLabel, il mio problema è che se tutte e 4 le etichette lampeggiano in momenti diversi, l'effetto lampeggiante non viene sincronizzato.

Come posso regolare il mio design in modo che anche se le etichette lampeggiano in momenti diversi, il lampeggio verrà sincronizzato?

******* Modificato ****** Ho aggiunto il seguente codice, ma ancora non riesco a far lampeggiare le etichette 1 e 2. Quello che sto cercando di fare è testare quanto segue: far lampeggiare label1 quindi faccio clic sul pulsante per far lampeggiare l'etichetta 2 e non vengono sincronizzati.

Qualche idea di cosa sto facendo male?

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(); 

    } 
+1

Utilizzare un timer per tutte le etichette. È possibile avere un override nelle etichette per consentire di controllare il lampeggiamento da una classe che può visualizzare/visualizzare tutte le etichette. Quindi usa un timer in quella classe per far lampeggiare tutti. – deathismyfriend

+0

.. puoi ancora impostare una bandiera su ogni etichetta per renderla partecipe è la festa o no .. – TaW

+0

@deathismyfriend per favore dai un'occhiata al mio codice di prova. grazie. – newbieLinuxCpp

risposta

12

È necessario utilizzare solo un timer e farlo lampeggiare tutto le etichette. Questo è il modo più elegante di creare un componente che implementa l'interfaccia IExtenderProvider. Simile al modo in cui funziona ErrorProvider, ti mostrerò uno che aggiunge una proprietà Blink a ogni controllo Label su un modulo.

Aggiungi una nuova classe al tuo progetto e incolla il codice mostrato di seguito. Compilare. Rilascia il nuovo componente dalla parte superiore della casella degli strumenti sul modulo. Imposta la proprietà Blink su qualsiasi etichetta che deve lampeggiare su 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>(); 
} 
4

cambiano colore allo stesso tempo non li hanno ma non sono sincronizzati. per sincronizzarli e utilizzare lo stesso colore. È necessario modificare il codice in modo che il colore batter è conservata dal timer o il controllo non le etichette provare qualcosa di simile

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