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?

È stato utile?

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.

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