2010-07-08 15 views

risposta

9

No, dovrai creare la tua casella di messaggio. la classe MessageBox supporta solo un comportamento simile a .ShowDialog() che è un'operazione modale.

È sufficiente creare un nuovo modulo che utilizzi parametri e utilizzi quelli per creare una casella di messaggio con stile a proprio piacimento.


Aggiornamento 2014-07-31

Nello spirito di mantenere la chiarezza per chiunque altro che trova questo attraverso google mi piacerebbe prendere un secondo per spiegare questo un po 'di più:

Sotto il cofano MessageBox è una fantasia C# wrapper Windows SDK user32.dll MessageBox Function e quindi si comporta esattamente allo stesso modo (dopo la conversione .NET enumerazioni nei numeri interi che rappresentano la stessa cosa nella chiamata di sistema.

Ciò significa che quando si chiama MessageBox.Show() la chiamata viene eseguita il marshalling all'esterno del sistema operativo e il blocco viene aperto finché non viene selezionata un'opzione o la finestra viene chiusa. Per evitare che il codice venga fermato è necessario avviare la finestra di messaggio su un thread separato, ma questo significa che qualsiasi risultato che torna dalla finestra di messaggio (/No/Ok/Cancellare/Ecc ...) verrà restituito al thread separato che è stato incaricato di chiamare la finestra di messaggio.

Se si agisce sul risultato di questa finestra di messaggio avviata in questo modo, sarà necessario inviare nuovamente il risultato alla discussione dell'interfaccia utente per sicurezza thread.

In alternativa è possibile creare il proprio modulo di messaggio in WinForms/WPF e chiamarlo con il metodo .Show(). Eventuali eventi click sui pulsanti verranno eseguiti sul thread dell'interfaccia utente e non sarà necessario inviare nuovamente le chiamate al thread dell'interfaccia utente per manipolare le cose nell'interfaccia utente.

+0

Ok, ho capito, quindi devo solo creare il mio modulo. Molto fattibile, grazie! – sooprise

+0

Quindi se avessi 'Messagebox.Show (MessageBoxButtons.OK) 'il programma si interromperà fino a quando un utente non fa clic sul pulsante OK? Perché voglio eseguire il mio processo di automazione e una volta completati i primi 2 processi, mettere in pausa il processo tramite Messagebox e, dopo che l'utente ha fatto clic sulla messagebox, eseguire il successivo processo di automazione. – HanH1113

+0

@ HanH1113 Il metodo 'MessageBox.Show()' sotto le copertine funziona in modo efficace allo stesso modo di '.ShowDialog()'. È un'operazione di blocco, quindi l'esecuzione viene interrotta fino alla chiusura della finestra di dialogo. Ho aggiornato la mia risposta per essere più chiara. – Aren

12

È possibile far ruotare un'altra pompa messaggi richiamandola su una filettatura separata. Il messaggio MessageBox.Show pompe è così sicuro da fare senza chiamare Application.Run.

public void ShowMessageBox() 
{ 
    var thread = new Thread(
    () => 
    { 
     MessageBox.Show(...); 
    }); 
    thread.Start(); 
} 

Edit:

probabilmente dovrebbe dire che io non consiglio di fare questo. Può causare altri problemi. Ad esempio, se si dispone di due thread che pompano i messaggi, è possibile che la finestra di messaggio resti bloccata dietro un altro modulo senza che sia possibile farla andare via se il modulo è in attesa che qualcuno chiuda la finestra del messaggio. Dovresti davvero cercare di capire un altro modo per aggirare il problema.

+0

'ThreadPool.QueueUserWorkItem (delegato {MessageBox.Show (" Text ");});' :) – sunside

+2

@Markus: Questo avrebbe fatto anche il trucco, tranne che avrebbe bloccato una discussione 'ThreadPool' che non sarebbe stata una buona pratica in generale. –

+0

In effetti, hai ragione. – sunside

Problemi correlati