2009-09-15 9 views
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?Formular deaktivieren, während BackgroundWorker beschäftigt ist?

Danke!

+1

Wenn Sie das Formular deaktivieren und den Code in den Hintergrund verschieben, was bringt es, ihn in den Hintergrund zu verschieben? – JaredPar

+0

Da ohne Hintergrundarbeiter Windows sagen wird, dass die Anwendung "nicht reagiert", wenn der Benutzer versucht, mit ihm zu interagieren. – Chris

Antwort

14

Vielleicht Enabled auf false gesetzt?

this.Enabled = false; 

, die ein bisschen drastischer ist aber, da es verhindert auch die Form von bewegt wird, die Größe verändert oder Veranstaltung geschlossen. Ein besserer Ansatz wäre ein Panel Steuerelement in Ihrem Formular, das Dock = Fill hat, und setzen Sie unsere anderen Steuerelemente in das Panel. Dann können Sie stattdessen die Enabled Eigenschaft von Panel verwenden, um weitere Benutzereingaben zu verhindern.

Hinweis gedacht, dass der Benutzer wird in der Lage sein, das Formular zu schließen, so dass in irgendeiner Weise würde anmutig behandelt werden.

+1

Dies ist ein schneller und schmutziger Weg, aber es könnte (abhängig von Ihrer Situation) besser sein, als jedes Steuerelement auf dem Formular zu deaktivieren, mit dem der Benutzer interagieren kann. –

+0

@Michael: Deaktivieren der Form ist in der Tat schnell und schmutzig: o) –

+0

Danke, ich habe etwas ähnliches wie Michael vorgeschlagen. – Chris

0

Eine andere Möglichkeit könnte sein, dass Sie alle Eingaben für die Anwendung "herausfiltern". 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, da alle KeyPress und Klicks durch die Filterprüfung gehen.

1

Ich stimme mit @ michael-todd in seinem Kommentar oben ü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. Methoden erstellen aktivieren oder alle geeigneten Navigation/Interaktion Sicherung deaktivieren (durch ihre Eigenschaft Enabled auf true/false Einstellung usw. als angemessen für jede Kontrolle)
  2. Aufruf der " Deaktivieren“Methode aus dem Code rechts, bevor Sie StartWorkerAsync() auf dem Hintergrund Arbeiter
  3. im Ereignishandler für RunWorkerCompleted rufen, rufen Sie die‚Enable-Methode‘, um die Ansicht für die Benutzereingabe wieder zu aktivieren
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).

+0

Dies kann ein ziemlich guter Trick sein, besonders wenn Sie möchten, dass das Hauptformular sichtbar und unverändert bleibt. Sie könnten sogar eine sehr kleine oder versteckte DialogForm verwenden. –

+1

Andere Sache, die ich getan habe, ist, alles in der Form zu haben, die in einem Panel enthalten ist, dann das Panel auszublenden und eine "Beschäftigt" -Nachricht hochzuladen. Auf diese Weise gibt es keine Möglichkeit, mit den zugrunde liegenden Steuerelementen zu interagieren. –

1

Es ist einfacher zu verwalten bestimmte Kontrollen zu deaktivieren, indem Sie sie in einem Schaltschrank platzieren und diese Platte statt Sperren einzelne Steuerungen zu deaktivieren:

controlPanel.Enabled = false; 

Ein üblicher Weg, andere Aufgaben zu blockieren, die Ihre Bedürfnisse erfüllen können, ist indem Sie ein Top-Formular mit einem Fortschrittsbalken anzeigen. 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 tatsächlich können Sie immer noch auf die anderen Funktionen klicken, auf die WinRAR fragt: "Möchten Sie die aktuelle Operation abbrechen?"

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. Durch das Deaktivieren des Formulars wird diese Art der Interaktion verhindert.

Verwandte Themen