Question

Quelqu'un peut-il penser à une bonne explication pour le fait que résultat d'un dialogue est un bool annulable dans WPF? Cela m'a toujours déconcerté. En WinForms il était un type ENUM et qui a fait beaucoup plus de sens pour moi.

Était-ce utile?

La solution

À mon avis cela a été fait parce que dans la plupart des cas, vous n'avez pas besoin les options généralisées spécialisées comme Retry ou Ignore.

Si vous avez besoin de plus de OK / Annuler, vous êtes censé utiliser une sorte de dialogue de tâche, par exemple avec des réponses écrites-out. De cette façon, vous n'êtes pas limité aux quelques valeurs enum quelqu'un a pensé il y a quelques décennies, et le DialogResult est juste positif / négatif pour une utilisation de base et vous pouvez mettre en œuvre votre propre propriété spécifique à vos besoins avancés. Par conséquent, seul vrai / faux est nécessaire, et en indiquant nulle que la fenêtre n'a pas été fermée encore (aucune valeur n'a été affectée à la propriété encore).

Si vous avez une boîte de dialogue est plus qu'une simple question, l'utilisateur doit répondre (par exemple un formulaire d'inscription), vous êtes généralement mieux avec OK / Annuler, vous n'avez pas besoin de plus de valeurs.

Autres conseils

La propriété DialogResult est définie sur la classe Window. Tous les Windows sont des boîtes de dialogue. Par conséquent, la propriété ne concerne pas toutes les fenêtres. Un Window qui a été montré par Show() plutôt que ShowDialog() sera (probablement, à moins que vous définissez pour une raison quelconque) ont DialogResult = null.

Voici un exemple simple pour démontrer:

Window1.xaml :

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <Button Name="b1">Show</Button>
        <Button Name="b2">ShowDialog</Button>
    </StackPanel>
</Window>

Window1.xaml.cs :

using System.Windows;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            b1.Click += new RoutedEventHandler(b1_Click);
            b2.Click += new RoutedEventHandler(b2_Click);
        }

        void b1_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.Closed += delegate
            {
                MessageBox.Show("" + w.DialogResult);
            };

            w.Show();
        }

        void b2_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.ShowDialog();
            MessageBox.Show("" + w.DialogResult);
        }
    }
}

Lorsque vous fermez les fenêtres, vous remarquerez que la boîte de dialogue a une DialogResult de false, tandis que la non-dialogue a une null DialogResult.

Selon la documentation MSDN :

  

DialogResult est nulle lorsque la boîte de dialogue   boîte est montrée mais ni acceptée ni   annulé.

Mais je ne sais pas comment cela pourrait se produire à moins que vous avez affaire à plusieurs threads accéder à la boîte de dialogue.

La documentation dit est faux quand l'une des choses suivantes se produisent:

  
      
  • PressesALT + F4.
  •   
  • clique sur le bouton Fermer.
  •   
  • sélectionner Fermer dans le menu système.
  •   

ShowDialog retourne toujours vrai ou faux. DialogResult ne prendra l'état nul lorsque la boîte de dialogue est ouvert. Transitioning de zéro à true ou false fermera la boîte de dialogue et de faire l'appel initial à un retour ShowDialog.

OMI, parce que DialogResult est pas toujours utilisé. Vous voyez, vous ne pouvez définir DialogResult si la fenêtre est appelée par sa méthode ShowDialog (), si vous l'appelez avec sa méthode Show (), et essayer de mettre DialogResult à quoi que ce soit, il va jeter un InvalidOperationException. Je pense donc que la raison est qu'il est annulable, au cas où vous appelez la fenêtre avec la méthode Show (), il sera nulle, si vous appelez à l'aide ShowDialog (), il est à vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top