2009-06-13 6 views
25

Il metodo Window.ShowDialog di WPF restituisce un valore booleano nullable. Così fa CommonDialog.ShowDialog.Quando ShowDialog() restituisce null?

Ora, capisco i casi in cui questi restituirebbero false (l'utente ha fatto clic su Annulla o ha premuto Esc) e quando restituirebbero true (il set di codici Window.DialogResult su true, probabilmente in risposta all'opzione OK su cui si fa clic). Ma nulla?

Il mio primo pensiero è che facendo clic sul pulsante Chiudi della barra del titolo si potrebbe restituire null. Ma i documenti dichiarano (e ho confermato testando) che the title-bar Close button is treated as a Cancel.

Quindi quando Window.ShowDialog o CommonDialog.ShowDialog restituisce mai null?

+0

Devi amare la documentazione di MS. "A Nullable <(Of <(T>)>) valore di tipo Booleano che indica come una finestra è stata chiusa dall'utente". Accidenti, questo aiuta. –

+0

Sembra il tipo di documentazione in cui gli sceneggiatori non erano autorizzati a parlare con gli sviluppatori e fare domande, ma gli era consentito solo l'accesso a ciò che avevano sullo schermo ... – SqlRyan

risposta

17

Il metodo restituisce sempre true o false e questa è sempre uguale alla proprietà DialogResult della finestra al momento della chiusura.

Ma la proprietà DialogResult è null prima che la finestra venga chiusa e un altro thread possa controllare la proprietà. Quindi ha senso che il valore restituito sia un valore nullo booleano che corrisponda alla proprietà, anche se non è mai effettivamente null.

+0

Non sai da dove ti venga l'idea che un altro thread potrebbe controlla DialogResult. Se ci provi, ottieni un InvalidOperationException ("Il thread chiamante non può accedere a questo oggetto perché ne possiede uno diverso.") –

+5

Non un altro thread, ma qualsiasi codice in esecuzione (ad esempio) su un gestore di eventi nella finestra di dialogo potrebbe recuperare il valore di DialogResult prima che si completi. Personalmente penso che sia una scelta di design scadente. Dovrebbe essere stato non annullabile, il getter lanciare un'eccezione se si accede prima che la finestra di dialogo si chiuda. –

2

Se restituisco DialogResult = null nell'evento Click per un pulsante, la finestra rimane aperta.

private void OkButton_Click(object sender, RoutedEventArgs e) 
{ 
    Button btn = sender as Button; 
    if (btn != null) 
    { 
     // forces all control to update... 
     btn.Focus(); 
    } 

    // TEST IF OK TO CLOSE 
    bool rc = _vm.ProcessOkCommand(); 
    if (rc) 
    { 
     DialogResult = true; 
    } 
    else 
    { 
     DialogResult = null; 
    } 
} 


<Button Content="OK" Name ="cmdOK" IsDefault="True" Click="OkButton_Click"/> 
+0

Giusto, questo è il mio punto: sembra che ShowDialog non restituirà mai null. –

+0

Non è meglio che non fare nulla rispetto all'impostazione di 'DialogResult = null;'. In effetti entrambi sono uguali, suppongo. Correggimi se sbaglio. –