Laden...

"Bitte warten"-Fenster anzeigen während Daten geladen werden

Erstellt von Alan vor 10 Jahren Letzter Beitrag vor 10 Jahren 3.348 Views
Thema geschlossen
A
Alan Themenstarter:in
22 Beiträge seit 2013
vor 10 Jahren
"Bitte warten"-Fenster anzeigen während Daten geladen werden

Hallo zusammen,

ich komme eigentlich aus der Java-Ecke und in SWT/Swing kann man den "ModalityType" direkt im jeweiligen Dialog festlegen. Als ich danach gesucht habe, wie das in C# funktioniert, habe ich feststellen müssen, dass es dort nicht vom Dialog abhängig ist, sondern davon, wie er angezeigt wurde.

Scheinbar gibt es in C# drei Arten, eine Form anzuzeigen (korrigiert mich bitte wenn ich mich irren sollte!):*form.Visible = true; *form.Show(); *form.ShowDialog();

Laut MSDN ist "form.Show()" das gleiche wie "form.Visible = true".

Was ich erreichen möchte ist: ich möchte einen modalen Dialog anzeigen. Dabei soll der Aufruf aber nicht-blockierend sein. Mit anderen Worten: ich will den modalen Dialog anzeigen lassen (mit allen Eigenschaften die dazu gehören, wie: Position zentriert und über dem Hauptfenster, Hauptfenster lässt keine Änderungen zu...), und dann aber mit der Ausführung des weiteren Codes nicht warten müssen, bis der Dialog geschlossen wurde. In meinem Fall handelt es sich um ein "Bitte Warten"-Fenster, das angezeigt wird, während im Hintergrund Daten von einem Server geladen werden - ich möchte damit verhindern, dass der Benutzer während dieser Zeit Änderungen an den lokalen Daten vornimmt.

Die naheliegende Variante wäre es, zuerst den BackgroundWorker zu starten, und anschließend das blockierende "ShowDialog()" zu verwenden. Das geht in meinem Fall aber leider nicht, da die Anwendung den Dialog laufend mit neuen Informationen (aktueller Arbeitsschritt, Fortschrittsanzeige etc.) versorgen soll. Eventuell könnte man einen eigenen Worker verwenden, dessen einzige Aufgabe es ist, das "form.ShowDialog()" auszuführen - aber ist das wirklich die bevorzugte Variante?

Ich wäre für Hinweise dankbar, die MSDN-Dokumentation ist in diesem Punkt leider recht dürftig.

Danke,

Alan

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Alan,

die Hinweise in [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) sind dagegen ausführlich und eindeutig: Nur ein GUI-Thread. Keine Fenster in einem anderen Thread erzeugen. Ist auch gar nicht nötig. Die langlaufenden Aktionen gehören in einen extra Thread. Deshalb ist es auch gar nicht nötig, dass der Dialog nicht blockiert.

Ansonsten ist das, was du willst, einem ==> Splash-Screen vergleichbar. Spätestens mit diesem Stichwort solltest du alle nötigen Informationen finden.

Im Grunde hätte dir klar sein müssen, dass du nicht als erster vor dem Problem stehst und das im Netz Lösungen zu finden sein müssen, siehe [Hinweis] Wie poste ich richtig? Punkt 1.1. Statt nach einem bestimmten Weg zu suchen, der einem als (vermeintliche) Lösung in den Sinn gekommen ist, sollte man besser nach dem suchen, was man eigentlich erreichen will. Den Titel habe ich entsprechend geändert.

herbivore

Thema geschlossen