Uzależnienia czasowe- Zdarzenia

0

Chcę zmieniać co np 1s tekst w Lableu.
Tworzę:

 private static System.Timers.Timer aTimer;
public MainWindow()
        {
 aTimer = new System.Timers.Timer(10000);

            // Hook up the Elapsed event for the timer.
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

            // Set the Interval to 2 seconds (2000 milliseconds).
            aTimer.Interval = 0.5;
            aTimer.Enabled = true;
}
 public void OnTimedEvent(object source, ElapsedEventArgs e)
        {
           mojlabel.Content("OK");
}

Jednak nie chce to działać. Jak można to poprawić?

0
aTimer.Interval = 1000 ;
// (......) 
label.Text = "OK" 

I nic Ci się nie będzie zmieniać, bo zawsze chcesz wpisywać "OK".

0
aTimer.Interval = 1000 ; 

tak miałem. Kod, który wkleiłem akurat był brany na testy;)
rozumiem, że się nie będzie zmieniać, ale jeśli program startuje z mojlablem.COntent="NIE"; to nie zmienia się na "OK". ...

0

Skopiuj cały kod z tego przykładu ze stron MS, i zmieniaj w tym kodzie, obserwuj co zmieniasz i jaki to ma skutek :)

0

zmieniłem:

private static void OnTimedEvent(object source, ElapsedEventArgs e)

na

public void OnTimedEvent(object source, ElapsedEventArgs e)
        {

ponieważ w metodzie statycznej nie mogę edytować obiektów danej klasy. Resztę mam bez zmian z MS. Znaczy dopisana linijka z napisem w labelu.

0

W OnTimeEvent daj:

mojlabel.Dispatcher.Invoke(() => mojlabel.Content = "OK");

I zapomiałeś o InitializeComponent() w MainWindow()

0

Jeśli resztę masz z MS i dopisałeś tylko linijkę z labelem, to ... gdzie umieściłeś ten label? :)

0

Jak kopiowałem, to nie zaznaczyłem InitializeComponent(); ponieważ mam za tym jeszcze część innego kodu;)
@dam1an

mojlabel.Dispatcher.Invoke(() => mojlabel.Content = "OK");

możesz to roztłumaczyć jakoś i napisać jak ma to dokładnie wyglądać?
dostaję taki błąd :
Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type C

0

Ma to wyglądać tak:

public void OnTimedEvent(object source, ElapsedEventArgs e)
        {
           mojlabel.Dispatcher.Invoke(() => mojlabel.Content = "OK");
        }

Chodzi o to że nie można ot tak po prostu zmieniać sobie zawartości labela z innego wątku.

0

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type
taki błąd wywala :<

0

To nie wiem, a w ten sposób:

        delegate void Del();
        Del myDel;
        private void ChangeLabel()
        {
            label1.Content = "ok";
        }
        public void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            label1.Dispatcher.Invoke(myDel);
            
        }
0

To przeszło, jednak Content labela się nie zmienia :(

1

Sorry zapomniałem:

myDel += ChangeLabel;

to jeszcze gdzieś przed odpaleniem timera w MainWindow()

0

Bardzo serdecznie dziękuję za pomoc @dam1an!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1