Formular deaktivieren, während BackgroundWorker beschäftigt ist?

7

Ich möchte nicht, dass der Benutzer mit meiner Anwendung interagiert, während ein bestimmter Hintergrundarbeiter beschäftigt ist (arbeitet). Ich habe dieses bgw erstellt, damit die Anwendung bei der Arbeit nicht eingefroren aussieht. Aber jetzt können sich Nutzer in der App bewegen. Wie deaktiviere ich mein Formular / meine Bewerbung?

Danke!

    
Chris 15.09.2009, 17:13
quelle

5 Antworten

14

Vielleicht Enabled auf false setzen?

%Vor%

Das ist ein bisschen drastisch, da es auch verhindert, dass das Formular verschoben, in der Größe geändert oder das Ereignis geschlossen wird. Ein besserer Ansatz wäre es, eine Panel -Kontrolle in Ihrem Formular zu platzieren, die Dock = Fill hat, und unsere anderen Steuerelemente in diese Panel zu setzen. Dann können Sie stattdessen die Enabled -Eigenschaft von Panel verwenden, um weitere Benutzereingaben zu verhindern.

Beachten Sie, dass der Benutzer wird in der Lage sein, das Formular zu schließen, so dass auf irgendeine Art und Weise behandelt werden sollte.

    
Fredrik Mörk 15.09.2009, 17:15
quelle
4

Sie können auch einen modalen "Besetzt-Splash" -Dialog erstellen, der angezeigt wird, wenn die Hintergrundaufgabe beim Beenden der Aufgabe gestartet und programmgesteuert entfernt wird. Sie könnten auch eine kleine Animation in diese Box einfügen, um den Benutzern mitzuteilen, dass etwas passiert. Sie müssen auch sicherstellen, dass sie den Dialog nicht manuell schließen (nur programmgesteuert beenden).

    
Garo Yeriazarian 15.09.2009 17:48
quelle
1

Ich stimme mit @ michael-todd in seinem obigen Kommentar überein und deaktiviere einzelne Steuerelemente / Navigationstasten / etc. während der Hintergrundarbeiter arbeitet, scheint eine ziemlich gute Lösung zu sein. Dies würde Ihnen eine fein abgestimmte Kontrolle darüber geben, was der Benutzer während der spezifischen Hintergrundoperation tun kann.

Sie könnten:

  1. Erstellen Sie Methoden zum Aktivieren oder Deaktivieren aller geeigneten Navigations- / Interaktions-Steuerelemente (indem Sie ihre Enabled-Eigenschaft für jedes Steuerelement auf true / false usw. setzen)
  2. Rufen Sie die Methode "Disable" aus Ihrem Code auf, bevor Sie StartWorkerAsync () für Ihren Hintergrund-Worker
  3. aufrufen
  4. Rufen Sie im Ereignishandler für RunWorkerCompleted die Methode "Enable" auf, um die Ansicht für Benutzereingaben erneut zu aktivieren
Guy Starbuck 15.09.2009 17:37
quelle
1

Es ist einfacher, bestimmte Steuerelemente zu deaktivieren, indem Sie sie in ein Bedienfeld einfügen und dieses Bedienfeld deaktivieren, anstatt einzelne Steuerelemente zu deaktivieren:

%Vor%

Eine gängige Methode zum Blockieren anderer Aufgaben, die Ihren Anforderungen entsprechen, besteht darin, ein Formular mit einer Fortschrittsleiste anzuzeigen. Das habe ich in der Vergangenheit mit Erfolg umgesetzt. Andere Programme machen das Gleiche. Wenn zum Beispiel in WinRAR die Anwendung beschäftigt ist, Dateien zu extrahieren oder zu komprimieren, zeigt die Anwendung eine oberste Form an. Es sieht wie eine "modale" Form aus, aber Sie können trotzdem auf die anderen Funktionen klicken, auf die WinRAR fragt: "Möchten Sie die aktuelle Operation abbrechen?"

Das Deaktivieren der gesamten Anwendung ist oft nicht notwendig und möglicherweise nicht intuitiv. Fragen Sie sich also, ob Sie wirklich die Interaktion mit dem Formular blockieren müssen. Zum Beispiel habe ich eine Anwendung, die einige Zeit braucht, um bestimmte Aufgaben zu erledigen. Ich biete einen Fortschrittsbalken für diese bestimmte Arbeit an, aber Sie können weiterhin mit der Anwendung interagieren, um zusätzliche Aufgaben zu starten, die gleichzeitig ausgeführt werden. Auch wenn Sie nur eine Aufgabe gleichzeitig ausführen dürfen, möchten Sie möglicherweise trotzdem die Hilfedatei anzeigen oder die Anwendungseinstellungen festlegen, während die Aufgabe ausgeführt wurde. Außerdem gebe ich dem Benutzer eine Schaltfläche, mit der er die Aufgabe stoppen kann. Das Deaktivieren des Formulars würde diese Art der Interaktion verhindern.

    
Marcus Adams 15.09.2009 18:29
quelle
0

Ein anderer möglicher Weg könnte sein, dass Sie alle Eingaben für die Anwendung "ausfiltern". Dies könnte durch Abhören von "KeyDown" und "MouseButtonDown" erfolgen. Sobald der Hintergrundjob ausgelöst wurde, können Sie das Flag FILTER_INPUT auf "true" setzen und es nach Abschluss zurücksetzen. Wenn das Flag FILTER_INPUT gesetzt ist, können alle Key und Mouse Ereignisse abgebrochen werden.

Dies ist möglicherweise nicht die effizienteste Methode, da alle KeyPress- und Klickvorgänge durch die Filterüberprüfung gehen.

    
Codex 15.09.2009 17:33
quelle

Tags und Links