Perché DialogResult nullable bool in WPF?
-
13-09-2019 - |
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.
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 Window
s 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
.
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.