Frage

eine Weile zurück, lief ich auf eine Situation, in der wir benötigten Nachrichtenfelder für den Benutzer für Benachrichtigungen angezeigt werden, aber wir können nicht MessageBox.Show verwenden, weil es blockiert der GUI-Thread (also nichts auf dem Bildschirm aktualisiert wird, während der Dialog aktiv). Irgendwelche Vorschläge auf eine Alternative?

[I codierte eine Alternative zu der Zeit, aber ich mag es nicht. Ich werde per Post als eine Antwort, wenn nichts besser obwohl] erscheint

EDIT: der Dialog auf dem Hauptfenster schweben muss; ist mir egal, ob es in der Taskleiste angezeigt wird oder nicht. Mehr als ein Dialog auf einmal aktiv sein kann unter bestimmten Umständen.

NACHTRAG: meine Lösung war eine Grundform, die Schaltflächen OK und Abbrechen vorgesehen abgeschlossen und Cancelled Ereignisse zu emittieren; OK genannt eine virtuelle validateData für Unterklasse außer Kraft setzen. Die Berufung Form Eigenschaften verwendet, um zu vermeiden das Formular jedes Mal neu zu erstellen (das Formular wurde gerade statt geschlossenen versteckt) und hielt einen Wörterbuch der aktiven Formen von der gleichen Form zu verhindern, mehr als einmal aktiviert werden. Dies sieht aus wie eine modale Form, unterstützt mehr Pop-up-Formulare auf einmal, aber nicht den Haupt GUI-Thread binden.

War es hilfreich?

Lösung

Ich bin mit rslite und Mitchel Sellers. eine nicht-Modal Form Erstellen der Informationen angezeigt werden benötigt wird, ist der beste Weg zu gehen. Wenn Sie mehrere Nachrichten haben, möchten Sie vielleicht zu prüfen, sie in eine ListBox setzen und haben die Benutzer auf sie doppelklicken Sie auf die vollständige Informationen zu erhalten, um angezeigt werden.

Andere Tipps

ich mit einem nicht-modalen Ansatz schlage vor zu gehen, wie andere schon gesagt, aber etwas präziser:

  • Wenn Sie nur eine Benachrichtigung wollen, können Sie eine Ballonspitze versuchen (TNA oder eigene) oder ein Fenster, wie die Outlook-Mail-Benachrichtigung oder die Benachrichtigung vieler Instant Messenger wie Trillian-Display ist.
  • Wenn Sie nur dem Benutzer die Möglichkeit geben wollen, zu handeln, um ein nicht-modales Formular verwenden, aber nicht vergessen, dass er nur könnte sehr gut klicken sie weg.
  • Wenn der Benutzer auf Ihre Nachricht handeln müssen, sollten Sie modal gehen. Beachten Sie, dass der Eigentümer Fenster wird noch lackiert werden und Sie können Ihre GUI aktualisieren - ein modaler Dialog, nachdem alle, eine Nachricht Pumpe hat, sonst würde es nicht funktionieren. Ich habe so etwas wie das vor kurzem haben wir einen Hintergrund Worker-Thread-Pool hatte, die auf Handlungen und Brandereignisse für die GUI seine Nachrichten pumpen zu aktualisieren, und einem modalen Warte Dialog, noch bekam tragen würde. Der Eigentümer Fenster tat Update mit der Aktion Hintergrund wie erwartet.

Was ist das Hinzufügen eines NotifyIcon auf Ihre Bewerbung und eine Ballonspitze anzuzeigen. Die Kehrseite ist, dass die Benachrichtigung nach kurzer Zeit verschwinden, aber vielleicht ist der beste für die Benutzer, wenn sie nicht handeln müssen.

Ich würde dieses Problem lösen, indem ein nicht-modales Dialogfeld oder vielleicht einige Tooltips auf den spezifischen Anforderungen abhängig.

Wenn Sie nicht wollen, es zu blockieren, ich würde nur Ihre eigene einfache Form erstellen die Anzeige zu tun. Das ist, wie ich Artikel für die Kunden vor Abschluss, wenn eine nicht-blockierende Lösung erforderlich war. Aber bedenken Sie, dass, wenn Sie es wie auch non-blocking, dass Benutzer ein Vielfaches aufstehen konnte und überwältigt werden, wenn sie wirklich „Sie müssen handeln“ Typ Artikel.

Dank an alle, die Vorschläge beigetragen haben, scheint es, dass meine Lösung ungefähr richtig war; -)

meine Lösung war eine Grundform, die OK zur Verfügung gestellt und CANCEL Tasten Abgeschlossen und Abgesagt Ereignisse zu emittieren; OK genannt eine virtuelle validateData für Unterklasse außer Kraft setzen. Die Berufung Form Eigenschaften verwendet, um zu vermeiden das Formular jedes Mal neu zu erstellen (das Formular wurde gerade statt geschlossenen versteckt) und hielt einen Wörterbuch der aktiven Formen von der gleichen Form zu verhindern, mehr als einmal aktiviert werden. Dies sieht aus wie eine modale Form, unterstützt mehr Pop-up-Formulare auf einmal, aber nicht den Haupt GUI-Thread binden.

Wenn Sie den MessageBox Look wollen und das Gefühl zeigt es nur in einem Hintergrundthread.

ThreadPool.QueueUserWorkItem( (state) =>
    {
         MessageBox.Show("Your message");
    });

(Code nicht getestet)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top