Entwickler-Ecke

WPF / Silverlight - Textbox aktualisieren (Dispatcher?, Binding?)


mmp5 - Do 02.09.10 11:30
Titel: Textbox aktualisieren (Dispatcher?, Binding?)
Hallo,
Ich habe eine Funktion die eine gewisse Zeit in anspruch nimmt um abgearbeitet zu werden. Die Funktion wird über einen Button ausgeführt.
innerhalb dieser Funktionen werden diverse dinge erledigt: lade ein Bild, berechne irgendwas etc.

Ich habe eine Textbox, die mir anzeigen soll, was gerade gemacht wird ...
z.B.: vor dem laden des Bildes:

C#-Quelltext
1:
2:
3:
textbox1.text = "Bild wird jetzt geladen ... "
imgSrc = loadImage(); 
textbox1.text = "Bild Wurde geladen"


ich habs schon mit Dispatchertimer versuch aber klappt auch nicht ...
ich habs auch mit Binding und INotifyPropertyChange versucht klappt auch nicht ...
da muss es doch ne möglichkeit geben ...

wonach muss ich suchen?
hat einer ne Lösung?


Yogu - Do 02.09.10 12:08

Wo liegt das Problem? Du kannst doch innerhalb der Methode ganz normal auf die Komponenten zugreifen, zum Beispiel, um den Text eines Labels zu ändern.

Wenn du willst, dass das Fenster während der Aktion bedienbar bleibt, brauchst du Suche in der Entwickler-Ecke THREADS und Suche in der Entwickler-Ecke INVOKE, aber davon hast du ja gar nichts geschrieben...


mmp5 - Do 02.09.10 12:38

mhhh ich weis nicht ob ich für meine Aufgabe wirklich mit Threads arbeiten muss ...

hier ein wenig bspCode:



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
private void button1_Click(object sender, RoutedEventArgs e)
{
            textBox1.Text = "1: Anfang";
            longTimeFunc();
            textBox1.Text = "2: Jetzt einmal durchlaufen";
            longTimeFunc();
            textBox1.Text = "3: jetzt zweimal durchlaufen und Fertig";
}

private void longTimeFunc()
{
            //System.Threading.Thread.Sleep(1000);
            int a = 0;
            for (int i = 0; i < 99999999; i++)
            {
                a += i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + a;
                a += i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + i - 10 + 19 * 2 / 2 % 10 + 2 % 2 + a;
            }
}


So, in der TextBox wird nur "3: jetzt zweimal durchlaufen und Fertig" angezeigt ...
Ich will aber, dass "1: ..." und "2: ..." auch angezeigt werden und zwar genau dann, wenn die im Programm an der Reihe sind ...

Ich weis nicht, ob das Bedienbar heißt?
Gehört anzeigen auch zu Bedienbarkeit?


Yogu - Do 02.09.10 13:13

Stimmt, da musst du noch eine Anweisung einfügen, nachdem du den Text geändert hast:


C#-Quelltext
1:
textBox1.Refresh();                    

Damit wird die Komponente neu gezeichnet.

user profile iconmmp5 hat folgendes geschrieben Zum zitierten Posting springen:
Ich weis nicht, ob das Bedienbar heißt?
Gehört anzeigen auch zu Bedienbarkeit?

Nein, mit Bedienbarkeit meinte ich, dass der Benutzer das Formular verschieben und auf andere Buttons klicken kann.


Th69 - Do 02.09.10 13:50

Alle langlaufenden Methoden (ca. >= 10ms) innerhalb von Eventhandlern sollten (besser: müssen!) in Threads ausgeführt werden (sonst meldet Windows dann: Fenster reagiert nicht mehr).
Als gute Alternative zu einem eigenen Thread kann man den BackgroundWorker benutzen und in dessen ProgressChanged-Ereignis dann die Aktualisierung der GUI-Elemente durchführen (die Eigenschaft 'WorkerReportsProgress' muß dann auf 'true' gesetzt sein!).

s.a. folgenden Beitrag: http://www.c-sharp-forum.de/viewtopic.php?t=91943