2009-06-17 19 views
8

Non riesco a trovare un modo per creare la funzionalità Form che voglio utilizzando C#.Chiudi finestra di dialogo modale da thread esterno - C#

Fondamentalmente, voglio avere una finestra di dialogo modale che ha un periodo di timeout specificato. Sembra che questo dovrebbe essere facile da fare, ma non riesco a farlo funzionare.

Dopo aver chiamato this.ShowDialog(parent), il flusso del programma si interrompe e non riesco a chiudere la finestra di dialogo senza che l'utente prima abbia fatto clic su un pulsante.

Ho provato a creare un nuovo thread utilizzando la classe BackgroundWorker, ma non riesco a farlo chiudere la finestra di dialogo su un thread diverso.

Mi manca qualcosa di ovvio qui?

Grazie per qualsiasi suggerimento è possibile fornire.

risposta

11

Utilizzare un System.Windows.Forms.Timer. Impostare la proprietà Interval come timeout e il relativo gestore di eventi Tick per chiudere la finestra di dialogo.

partial class TimedModalForm : Form 
{ 
    private Timer timer; 

    public TimedModalForm() 
    { 
     InitializeComponent(); 

     timer = new Timer(); 
     timer.Interval = 3000; 
     timer.Tick += CloseForm; 
     timer.Start(); 
    } 

    private void CloseForm(object sender, EventArgs e) 
    { 
     timer.Stop(); 
     timer.Dispose(); 
     this.DialogResult = DialogResult.OK; 
    } 
} 

Il timer viene eseguito sul thread dell'interfaccia utente in modo che sia sicuro per chiudere la maschera dal gestore di eventi tick.

1

è possibile Invoke la stretta dal thread in background

11

Sarà necessario chiamare il metodo Close sul thread che ha creato il modulo:

theDialogForm.BeginInvoke(new MethodInvoker(Close)); 
3

Se si desidera solo una finestra di dialogo modale, ho trovato che questa è la soluzione migliore di gran lunga: http://www.codeproject.com/KB/miscctrl/CsMsgBoxTimeOut.aspx (leggi la sezione commenti per una piccola modifica).

Se si desidera visualizzare il proprio modulo in modo modale, la soluzione di adrianbanks è la migliore.

Problemi correlati