2015-05-07 9 views
8

Ich habe eine BlinkingLabel Klasse erstellt, abgeleitet von Forms.Label, die eine Forms.Timer hat, die mir ermöglicht, den blinkenden Effekt zu aktivieren und zu deaktivieren.Sync blinkende Etiketten in C#

Ich habe 4 Etiketten von BlinkingLabel Typ erstellt, mein Problem ist, dass, wenn alle 4 Etiketten wo zu verschiedenen Zeiten blinken, der blinkende Effekt nicht synchronisiert wird.

Wie kann ich mein Design so einstellen, dass selbst wenn die Labels zu verschiedenen Zeiten blinken, das Blinken synchronisiert wird?

******* Bearbeitet ****** Ich habe den folgenden Code hinzugefügt, aber immer noch kann ich Label 1 und 2 nicht gleichzeitig blinken. Was ich versuche, ist Folgendes zu testen: make label1 blinkt, dann klicke ich auf den Button, um Label 2 zu blinken und sie werden nicht synchronisiert.

Irgendeine Idee, was ich falsch mache?

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

Verwenden Sie einen Timer für alle Etiketten. Sie können eine Überschreibung in Ihren Beschriftungen verwenden, um das Blinken einer Klasse zu steuern, die alle Beschriftungen anzeigen kann. Verwenden Sie dann einen Timer in dieser Klasse, damit alle blinken. – deathismyfriend

+0

..Sie können immer noch eine Flagge auf jedem Etikett setzen, um es teilnehmen zu lassen, ist das Fest oder nicht .. – TaW

+0

@deathismyfriend bitte sehen Sie sich meinen Testcode an. Danke. – newbieLinuxCpp

Antwort

12

Sie benötigen ein Timer nur zu verwenden, und bekommen es alle blinken die Etiketten. Dies geschieht am elegantesten durch das Erstellen einer Komponente, die die IExtenderProvider-Schnittstelle implementiert. Ähnlich wie ErrorProvider funktioniert, zeige ich Ihnen eine, die jedem Label-Steuerelement in einem Formular eine Blink-Eigenschaft hinzufügt.

Fügen Sie Ihrem Projekt eine neue Klasse hinzu und fügen Sie den unten gezeigten Code ein. Kompilieren. Legen Sie die neue Komponente oben in der Toolbox auf Ihrem Formular ab. Setzen Sie die Blink-Eigenschaft auf eine beliebige Beschriftung, die auf "True" (wahr) blinken muss.

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

sie die Farbe wechseln zur gleichen Zeit haben sie nicht, aber sie sind nicht synchronisiert. , um sie zu synchronisieren und die gleiche Farbe zu verwenden. Sie haben den Code zu ändern, so dass die Blinkfarbe durch den Timer oder die Kontrolle gehalten wird, nicht die Etiketten versuchen so etwas wie dieses

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