Domanda

qualche tempo fa mi sono imbattuto in una situazione in cui dovevamo mostrare all'utente le finestre di messaggio per le notifiche ma non potevamo usare MessageBox.Show perché blocca il thread della GUI (quindi nulla sullo schermo viene aggiornato mentre la finestra di dialogo è attivo). Qualche suggerimento su un'alternativa?

[Ho codificato un'alternativa al momento, ma non mi piace. Lo pubblicherò come risposta se non appare nulla di meglio]

EDIT: la finestra di dialogo deve essere posizionata sopra la finestra principale; non mi importa se appare nella barra delle applicazioni o no. Più di una finestra di dialogo può essere attiva contemporaneamente in determinate circostanze.

ADDENDUM: la mia soluzione era un modulo di base che forniva i pulsanti OK e CANCEL per emettere eventi completati e annullati; OK ha chiamato un ValidateData virtuale per l'override della sottoclasse. Il modulo chiamante utilizzava le proprietà per evitare di ricreare ogni volta il modulo (il modulo era appena nascosto anziché chiuso) e manteneva un dizionario di moduli attivi per impedire l'attivazione dello stesso modulo più di una volta. Sembra un modulo modale, supporta più moduli popup contemporaneamente, ma non collega il thread della GUI principale.

È stato utile?

Soluzione

Sono d'accordo con i rivenditori rslite e Mitchel. La creazione di un modulo non modale per visualizzare le informazioni necessarie è la strada migliore da percorrere. Se hai più messaggi, potresti prendere in considerazione l'idea di inserirli in un ListBox e far fare doppio clic all'utente su di essi per ottenere le informazioni complete che devono essere visualizzate.

Altri suggerimenti

Suggerisco di seguire un approccio non modale, come altri hanno detto, ma un po 'più specifico:

  • Se vuoi solo una notifica, puoi provare un suggerimento a forma di palloncino (TNA o il tuo) o una finestra che è come la notifica di posta di Outlook o la notifica che molti messaggeri istantanei come Trillian visualizzano.
  • Se vuoi solo dare all'utente la possibilità di agire, usa un modulo non modale, ma ricorda che potrebbe benissimo fare clic su di esso.
  • Se l'utente DEVE agire in base al tuo messaggio, dovresti diventare modale. Nota che la finestra del proprietario verrà comunque dipinta e puoi aggiornare la tua GUI - una finestra di dialogo modale, dopo tutto, ha un pump dei messaggi, altrimenti non funzionerebbe. Di recente ho fatto una cosa del genere, avevamo un pool di thread di lavoro in background che avrebbe portato avanti eventuali azioni ed eventi di fuoco per la GUI da aggiornare, e una finestra di dialogo di attesa modale che ha ancora ottenuto il suo flusso di messaggi. La finestra del proprietario è stata aggiornata con l'azione in background come previsto.

Che dire dell'aggiunta di un NotifyIcon alla tua applicazione e visualizzando un suggerimento per il palloncino . Il lato negativo è che la notifica scomparirà dopo breve tempo, ma forse è meglio per i tuoi utenti se non hanno bisogno di agire.

Lo risolverei usando una finestra di dialogo non modale o forse alcuni suggerimenti a seconda dei requisiti specifici.

Se non vuoi che si blocchi, creerei semplicemente il tuo semplice modulo per fare il display. È così che ho completato gli articoli per i clienti prima quando era necessaria una soluzione non bloccante. Ma tieni presente che se lo fai in modo non bloccante, gli utenti potrebbero aumentare i multipli ed essere sopraffatti se sono davvero "quotati", devi agire " digitare elementi.

grazie a tutti coloro che hanno contribuito con i suggerimenti, sembra che la mia soluzione fosse giusta ;-)

la mia soluzione era un modulo di base che forniva i pulsanti OK e CANCEL per emettere eventi completati e annullati; OK ha chiamato un ValidateData virtuale per l'override della sottoclasse. Il modulo chiamante utilizzava le proprietà per evitare di ricreare ogni volta il modulo (il modulo era appena nascosto anziché chiuso) e manteneva un dizionario di moduli attivi per impedire l'attivazione dello stesso modulo più di una volta. Sembra un modulo modale, supporta più moduli popup contemporaneamente, ma non collega il thread della GUI principale.

Se vuoi l'aspetto e la sensazione di MessageBox, mostralo in un thread in background.

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

(codice non testato)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top