Domanda

Qualcuno può pensare a una buona spiegazione per il fatto che il risultato di un dialogo, è un nullable bool in WPF?Questo è sempre perplesso.In WinForms era un tipo enum e che ha reso molto più senso per me.

È stato utile?

Soluzione

A mio parere questo è stato fatto perché nella maggior parte dei casi non è necessario il generalizzata e specializzata opzioni come Riprova o Ignora.

Se avete bisogno di più di OK/Annulla, si suppone di utilizzare un qualche tipo di dialogo di attività, ad es.con scritto-risposte.In quel modo, non si è limitato a poche valori enum che qualcuno pensasse di alcuni decenni fa, e la DialogResult è solo positivo/negativo per uso di base e si può implementare la propria struttura che è specifico per il vostro esigenze avanzate.Quindi solo vero/falso è necessario, e null indica che la finestra non ha chiuso ancora (nessun valore è stato assegnato alla proprietà di sicurezza).

Se si dispone di una finestra di dialogo che è più di una domanda, l'utente deve rispondere (ad es.un modulo di iscrizione), non è in genere meglio con OK/Annulla, quindi non c'è bisogno di più valori.

Altri suggerimenti

La proprietà DialogResult è definita sulla classe Window. Non tutte le Windows sono le finestre di dialogo. Pertanto, la proprietà non è rilevante per tutte le finestre. Un Window che è stato dimostrato attraverso Show() piuttosto che ShowDialog() volontà (presumibilmente, a meno che non lo si imposta per qualche motivo) hanno DialogResult = null.

Ecco un semplice esempio per dimostrare:

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);
        }
    }
}

Quando si chiude le finestre, si noterà che la finestra di dialogo ha un DialogResult di false, mentre il non-dialogo ha un null DialogResult.

MSDN documentazione :

  

DialogResult è nullo quando la finestra di dialogo   dialogo è mostrata ma né accettato né   annullata.

Ma io non sono sicuro di come sia potuto accadere a meno che non hai a che fare con più thread l'accesso alla finestra di dialogo.

La documentazione dice che è falso quando una delle seguenti cose accadono:

  
      
  • PressesALT + F4.
  •   
  • fa clic sul pulsante Chiudi.
  •   
  • Seleziona Chiudi dal menu di sistema.
  •   

ShowDialog restituisce sempre vero o falso. DialogResult vorranno solo lo stato nulla quando la finestra è aperta. Transizione da null per vero o falso si chiuderà la finestra di dialogo ed effettuare la chiamata originale al ritorno ShowDialog.

IMO questo è perché DialogResult non è sempre utilizzato. Vedete, è possibile impostare solo DialogResult se la finestra è chiamato con il suo metodo ShowDialog (), se lo si chiama con il suo metodo Show (), e cercare di impostare DialogResult a nulla, sarà lanciare un InvalidOperationException. Quindi penso che è la ragione è annullabile, nel caso in cui si richiama la finestra con il metodo Show (), sarà nullo, se lo si chiama utilizzando ShowDialog (), tocca a voi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top