7 Stimmen

Formular deaktivieren, wenn BackgroundWorker beschäftigt ist?

Ich möchte nicht, dass der Benutzer mit meiner Anwendung interagiert, während ein bestimmter Backgroundworker beschäftigt ist (arbeitet). Ich habe diesen Bgw erstellt, damit die Anwendung nicht eingefroren aussieht, wenn sie arbeitet. Aber jetzt können sich die Benutzer in der Anwendung bewegen. Wie kann ich mein Formular/ meine Anwendung deaktivieren?

Danke!

14voto

Fredrik Mörk Punkte 151006

Vielleicht setzen Enabled a false ?

this.Enabled = false;

Das ist allerdings etwas drastisch, denn es verhindert auch, dass das Formular verschoben, in der Größe verändert oder geschlossen werden kann. Ein besserer Ansatz wäre es, ein Panel Steuerelement in Ihrem Formular, das über Dock = Fill und setzen unsere anderen Steuerelemente in diese Panel . Dann können Sie stattdessen die Enabled Eigenschaft der Panel um weitere Benutzereingaben zu verhindern.

Beachten Sie, dass der Benutzer wird in der Lage sein, das Formular zu schließen, also sollte das auf irgendeine Weise elegant gehandhabt werden.

4voto

Garo Yeriazarian Punkte 2503

Sie könnten auch ein modales "busy splash"-Dialogfeld erstellen, das angezeigt wird, wenn die Hintergrundaufgabe beginnt, und programmatisch entfernt wird, wenn die Aufgabe endet. Sie könnten auch eine kleine Animation in dieses Feld einfügen, damit die Benutzer wissen, dass etwas vor sich geht. Sie müssten auch dafür sorgen, dass das Dialogfeld nicht manuell geschlossen wird (es kann nur programmgesteuert geschlossen werden).

1voto

Guy Starbuck Punkte 21075

Ich stimme @michael-todd in seinem obigen Kommentar zu. Die Deaktivierung einzelner Steuerelemente/Navigationsschaltflächen/etc. während der Hintergrundarbeit scheint eine ziemlich gute Lösung zu sein. Dies würde Ihnen feinkörnige Kontrolle darüber geben, was der Benutzer während der spezifischen Hintergrundoperation tun kann.

Das könnten Sie:

  1. Erstellen Sie Methoden zum Aktivieren oder Deaktivieren aller entsprechenden Navigations-/Interaktionssteuerelemente (indem Sie deren Eigenschaft Enabled auf true/false usw. setzen, je nachdem, was für jedes Steuerelement angemessen ist)
  2. Rufen Sie die "Disable"-Methode in Ihrem Code auf, bevor Sie StartWorkerAsync() für Ihren Hintergrundworker aufrufen
  3. Rufen Sie im Ereignishandler für RunWorkerCompleted die Methode "Enable" auf, um die Ansicht wieder für Benutzereingaben freizugeben

1voto

Marcus Adams Punkte 51234

Es ist einfacher, bestimmte Steuerelemente zu deaktivieren, indem man sie in einem Bereich platziert und diesen Bereich deaktiviert, als einzelne Steuerelemente zu deaktivieren:

controlPanel.Enabled = false;

Eine gängige Methode, um andere Aufgaben zu blockieren, die Ihren Anforderungen entsprechen könnte, ist die Anzeige eines Formulars mit einem Fortschrittsbalken ganz oben. Ich habe dies in der Vergangenheit mit Erfolg eingesetzt. Andere Programme machen das Gleiche. In WinRAR zum Beispiel zeigt die Anwendung, wenn sie mit dem Extrahieren oder Komprimieren von Dateien beschäftigt ist, ein Formular im oberen Bereich an. Es sieht aus wie ein "modales" Formular, aber in Wirklichkeit kann man immer noch auf die anderen Funktionen klicken, woraufhin WinRAR fragt: "Möchten Sie den aktuellen Vorgang abbrechen?"

Die Deaktivierung der gesamten Anwendung ist oft nicht notwendig und möglicherweise nicht intuitiv. Fragen Sie sich also, ob Sie die Interaktion mit dem Formular wirklich blockieren müssen. Ich habe zum Beispiel eine Anwendung, die einige Zeit braucht, um bestimmte Aufgaben zu erledigen. Ich stelle einen Fortschrittsbalken für diese spezielle Aufgabe zur Verfügung, aber Sie können immer noch mit der Anwendung interagieren, um zusätzliche Aufgaben zu starten, die gleichzeitig laufen. Selbst wenn ich Ihnen nur die Ausführung einer einzigen Aufgabe erlaube, möchten Sie vielleicht die Hilfedatei anzeigen oder die Anwendungseinstellungen festlegen, während die Aufgabe läuft. Außerdem gebe ich dem Benutzer eine Schaltfläche, mit der er die Aufgabe anhalten kann. Die Deaktivierung des Formulars würde diese Art der Interaktion verhindern.

0voto

Codex Punkte 1022

Eine andere Möglichkeit wäre, dass Sie alle Eingaben in die Anwendung "herausfiltern". Dies könnte geschehen, indem man auf "KeyDown" und "MouseButtonDown" hört. Sobald der Hintergrundjob ausgelöst wird, könnten Sie das FILTER_INPUT-Flag auf true setzen und es nach Abschluss zurücksetzen. Wenn das FILTER_INPUT-Flag gesetzt ist, können Sie alle Tasten- und Mausereignisse abbrechen.

Dies ist vielleicht nicht die effizienteste Lösung, da alle Tastendrücke und Klicks durch die Filterprüfung gehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X