Forum: PC-Programmierung Blinkender Button C#


von Leon E. (adiagi)


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

von Sharping (Gast)


Lesenswert?

Na komm, das schaffst du ;-)
Stichwörter: Timer, Button.BackColor

von Leon E. (adiagi)


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

von Ralf (Gast)


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

von c##### (Gast)


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
    }

von Leon E. (adiagi)


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

von Leon E. (adiagi)


Lesenswert?

Ralf schrieb:
> - in der Klick-Routine startest du den Timer

Wie sieht das dann aus codemßig,
muss ich nur ein eintervall setzen oder ?

Gruß

Agit

von Leon E. (adiagi)


Lesenswert?

Agit A. schrieb:
> Benötige ich evt. ein Assembly`?

Habs hinbekommen,
Benötigte das assembly WindwoBase.

Gruß
Agit

von c##### (Gast)


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.

von Christopher C. (Gast)


Lesenswert?

Mensch wenn man nicht weiß, wie etwas in C# bzw. .Net Framework zu 
benutzen ist, dann schaut man in die Doku.

In dem Fall MSDN (ich nehme mal an, dass du die WinForms benutzt):
http://msdn.microsoft.com/de-de/library/system.windows.forms.timer

Da gibts sogar ein Beispiel.

von Sebastian L. (Gast)


Lesenswert?

oh main gott

Kannst du echt nicht googeln oder was?

http://www.morkalork.com/mork/article/47/How_to_use_the_timer_control_in_C

von Leon E. (adiagi)


Lesenswert?

hi,

Leute seid nicht immer so zickig :)

@c#####

danke funnktioniert wunderbar.

Gruß
Agit

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.