2009-06-13 10 views
25

La méthode Window.ShowDialog de WPF renvoie un booléen Nullable. Il en est de même pour CommonDialog.ShowDialog.Quand ShowDialog() renverrait null?

Maintenant, je comprends les cas où ceux-ci retourneraient faux (utilisateur cliqué sur Annuler ou appuyé sur Esc), et quand ils reviendraient vrai (ensembles de codes Window.DialogResult à vrai, probablement en réponse à OK cliqué). Mais nul? Ma première pensée est que cliquer sur le bouton Fermer de la barre de titre peut renvoyer une valeur nulle. Mais l'état de docs (et j'ai confirmé en testant) que the title-bar Close button is treated as a Cancel.

Alors, quand est-ce que Window.ShowDialog ou CommonDialog.ShowDialog retournerait null?

+0

Vous devez aimer la documentation MS. "A Nullable <(Of <(T>)>) valeur de type Boolean qui signifie comment une fenêtre a été fermée par l'utilisateur." Gee, ça aide. –

+0

Cela ressemble au genre de documentation où les rédacteurs n'étaient pas autorisés à parler aux développeurs et à poser des questions, mais n'avaient accès qu'à ce qu'ils avaient sur l'écran ... – SqlRyan

Répondre

17

La méthode renvoie toujours true ou false et est toujours égale à la propriété DialogResult de la fenêtre au moment de la fermeture.

Mais la propriété DialogResult est null avant la fermeture de la fenêtre et un autre thread peut vérifier la propriété. Il est donc logique que la valeur de retour soit un booléen Nullable pour correspondre à la propriété, même si elle n'est jamais nulle.

+0

Vous ne savez pas où vous avez l'idée qu'un autre fil pourrait Vérifiez DialogResult. Si vous essayez, vous obtenez une InvalidOperationException ("Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède.") –

+5

Aucun autre thread, mais tout code exécuté (disons) sur un gestionnaire d'événement dans la boîte de dialogue peut récupérer la valeur de DialogResult avant la fin. Personnellement, je pense que c'est un mauvais choix de conception. Il aurait dû être non-nullable, le getter lançant une exception s'il est accédé avant que la boîte de dialogue se ferme. –

2

Si je retourne DialogResult = null dans l'événement Click pour un bouton, la fenêtre reste ouverte.

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

Bon, c'est mon point - on dirait que ShowDialog ne retournera jamais null. –

+0

Il ne vaut mieux rien faire que de régler 'DialogResult = null;'. Effectivement, les deux sont identiques, je suppose. Corrige moi si je me trompe. –