Blinkender Button C#

#2774552
Lesenswert?

hi,

hab hier ein Problem,
Hätte gerne einen Button, der beim Klicken fr eine bestimmte Zeit blinkt 
und dann wieder in en Anfangszustand gesetzt wird.
Ich weiß, dass es mit einem Timer Intervall gehen muss, aber irgendwie 
bekomm ich nicht ganz hin.
Vlt hat ja einer einen Codeauschnitt wie es aussehen könnte.

Gruß
Agit
#2774582
Lesenswert?

hi Sharping,

es is mir auch klar, dass ich BackColor verwenden muss.

nun es ist so.
Wenn ich auf den Button klicke ist mein Code im Klick-Ereigniss.
Hier ändere ich die Farben dann über eine schleife.
Das Problem ist, dass die Oberfläche diese zwischenschritte nicht 
anzeigt, erst wenn die Routine verlasen wird ändert sich auch die Farbe 
des Buttons.

Dabke fr die Hilfe.

Gruß
Agit
Gast #2774592
Lesenswert?

> Wenn ich auf den Button klicke ist mein Code im Klick-Ereigniss.
> Hier ändere ich die Farben dann über eine schleife.
> Das Problem ist, dass die Oberfläche diese zwischenschritte nicht
> anzeigt, erst wenn die Routine verlasen wird ändert sich auch die Farbe
> des Buttons.
Klingt logisch... Die GUI wird wahrscheinlich erst aktualisiert, wenn 
die Klick-Routine abgearbeitet ist - da ist deine Schleife aber auch 
schon durchgelaufen... Du könntest der GUI mitteilen, dass sie sich 
aktualisieren soll, aber das halte ich irgendwie für unsauber...

Ändere es um:
- in der Klick-Routine startest du den Timer
- Der Timer-Event verwaltet sich selbst, er hat die Anzahl der nötigen 
Schleifendurchläufe etc.
- Jedesmal wenn der Timer-Event auftritt änderst du die Farbe und 
verlässt danach die Event-Routine wieder (d.h. du brauchst z.T. 
statische Variablen in der Event-Routine, damit du dir den Zustand 
merken kannst)
- Wenn das letzte Ändern der Farbe erreicht ist stoppst du den Timer 
(Alternativ kannst du den Timer auch jedesmal in seiner Event-Routine 
neu starten, nur eben nach dem letzten Farbwechsel nicht).

Ralf
Gast #2774611
Lesenswert?

Hier ein Codeausschnitt, der ein Label im Sekundentakt blinken lässt:
1
   public partial class MainWindow : Window
2
    {
3
        DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
4

5
        public MainWindow()
6
        {
7
            InitializeComponent();
8
            dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
9
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);           
10
        }
11

12
       private int z = 0;
13

14
       private void dispatcherTimer_Tick(object sender, EventArgs e)
15
       {
16
           if (z % 2 == 0)
17
           {
18
               label1.Background = Brushes.Blue;
19
               dispatcherTimer.Start();
20
           }
21
           else
22
           {
23
               label1.Background = Brushes.Yellow;
24
               dispatcherTimer.Start();
25
           }
26
           z++;
27
           if (z >= 10)
28
           {
29
               dispatcherTimer.Stop();
30
               z = 0;
31
           }
32
       }
33
       
34
        private void label1_MouseDown(object sender, MouseButtonEventArgs e)
35
        {
36
            dispatcherTimer.Start();
37
        }
38
    }
#2774659
Lesenswert?

hi,

danke Ralf.

c##### schrieb:
> Hier ein Codeausschnitt

wieso kann ich

DispatcherTimer dispatcherTimer = new 
System.Windows.Threading.DispatcherTimer();

bei mir nicht anwenden.

Hier der Code
1
 public partial class DeviceMappingControl : UserControl
2
    {
3
        private int z = 0;
4
        private readonly FCatEntryList _factEntryListDevice;
5
        private readonly FCatEntryList _factEntryListINIC;
6
        System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); // Fehlermeldung: Der Typ- oder Namespacename "DispatcherTimer" ist im Namespace "System.Threading" nicht vorhanden. (Fehlt ein Assemblyverweis?)

Ich hab kein System.Windows.Threading, sondern nur System.Threading.
Benötige ich evt. ein Assembly`?
Danke für die Hilfe.

Gurß

Agit
Gast #2774698
Lesenswert?

Ich hab's als WpfApplication ausprobiert und arbeite mit Visual C# 2010 
Express. Microsoft .NET Framework Version 4.0.30319 RTMRel.
1
using System.Windows.Threading;
mit
1
DispatcherTimer dispatcherTimer = new DispatcherTimer();

oder alternativ
1
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();

funktionieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren