Come creare una finestra di dialogo modale in WPF?
-
20-08-2019 - |
Domanda
Sto scrivendo la mia prima applicazione in WPF e voglio che l'utente inserisca alcuni dati in una finestra di dialogo modale. Apparentemente, questo non è semplice da fare in WPF, perché la finestra padre rimane completamente abilitata e il metodo che ha creato la nuova finestra figlio non si ferma e aspetta che la finestra figlio chiami Close (). Invece continua ad andare avanti. Questo non è quello che voglio.
Come posso aprire la finestra figlio e fare in modo che la finestra padre attenda la chiusura del figlio prima che la finestra padre continui a essere eseguita?
Soluzione
Hai provato a mostrare la tua finestra usando ShowDialog metodo?
Non dimenticare di impostare Proprietà del proprietario nella finestra di dialogo della finestra principale. Questo eviterà comportamenti strani quando Alt + Tabbing, ecc.
Altri suggerimenti
Molte di queste risposte sono semplicistiche e se qualcuno sta iniziando WPF, potrebbe non conoscere tutte le " ins-and-outs " ;, poiché è più complicato del semplice dirlo a qualcuno " Usa .ShowDialog()
! " ;. Questo è il metodo (non .Show()
) che si desidera utilizzare per bloccare l'uso della finestra sottostante e impedire che il codice continui fino alla chiusura della finestra modale.
Innanzitutto, sono necessarie 2 finestre WPF. (Uno chiamerà l'altro.)
Dalla prima finestra, diciamo che è stato chiamato MainWindow.xaml, nel suo code-behind sarà:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
Quindi aggiungi il tuo pulsante al tuo XAML:
<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />
E fai clic con il pulsante destro del mouse sulla routine Click
, seleziona " Vai alla definizione " ;. Lo creerà per te in MainWindow.xaml.cs:
private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}
All'interno di quella funzione, devi specificare l'altra pagina usando la sua classe di pagina. Supponiamo che tu abbia chiamato quell'altra pagina & Quot; ModalWindow & Quot ;, in modo che diventi la sua classe di pagina ed è il modo in cui lo creeresti (chiamalo):
private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
ModalWindow modalWindow = new ModalWindow();
modalWindow.ShowDialog();
}
Supponi di avere un valore che devi impostare nella finestra di dialogo modale. Crea una casella di testo e un pulsante in ModalWindow
XAML:
<StackPanel Orientation="Horizontal">
<TextBox Name="txtSomeBox" />
<Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" />
</StackPanel>
Quindi crea nuovamente un gestore eventi (un altro this.Close()
evento) e usalo per salvare il valore della casella di testo in una variabile statica pubblica su <=> e chiama <=>.
public partial class ModalWindow : Window
{
public static string myValue = String.Empty;
public ModalWindow()
{
InitializeComponent();
}
private void btnSaveData_Click(object sender, RoutedEventArgs e)
{
myValue = txtSomeBox.Text;
this.Close();
}
}
Quindi, dopo la tua <=> dichiarazione, puoi prendere quel valore e usarlo:
private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
ModalWindow modalWindow = new ModalWindow();
modalWindow.ShowDialog();
string valueFromModalTextBox = ModalWindow.myValue;
}
Window.Show Window mostrerà la finestra e continuerà l'esecuzione - è una chiamata non bloccante.
Window.ShowDialog bloccherà il thread chiamante (kinda [1]) e mostrerà la finestra di dialogo. Bloccherà anche l'interazione con la finestra principale / proprietaria. Quando la finestra di dialogo viene chiusa (per qualsiasi motivo) ShowDialog tornerà al chiamante e ti consentirà di accedere a DialogResult (se lo desideri).
[1] Manterrà il pompaggio del dispatcher spingendo un telaio del dispatcher sul dipatcher WPF. Ciò farà sì che il pump dei messaggi continui a pompare.
Dato un oggetto Window myWindow, myWindow.Show () lo aprirà in modo non modale e myWindow.ShowDialog () lo aprirà in modo modale. Tuttavia, anche quest'ultimo non si blocca, da quello che ricordo.