Frage

Ich bin meine erste Anwendung in WPF zu schreiben und möchte einige Daten der Benutzereingabe auf einem modalen Dialogfenster haben. Offenbar ist dies nicht einfach in WPF zu tun, weil das übergeordnete Fenster vollständig aktiviert bleibt, und die Methode, die das neue Kind Fenster erstellt nicht für das Kind Fenster anhalten und warten Close () aufzurufen. Statt nur hält die Zukunft. Das ist nicht das, was ich will.

Wie kann ich das Kind Fenster bekommen zu öffnen und habe das übergeordnete Fenster warten, bis das Kind vor dem übergeordneten Fenster schließen weiter ausgeführt wird?

War es hilfreich?

Lösung

Haben Sie versucht, um Ihr Fenster mit dem Showdialog Methode?

Sie nicht vergessen, die Owner-Eigenschaft auf dem Dialogfenster in das Hauptfenster. Dadurch wird vermieden, seltsames Verhalten, wenn Alt + Tabbing, etc.

Andere Tipps

Viele dieser Antworten sind stark vereinfacht, und wenn jemand WPF beginnt, können sie nicht alle „ins-and-outs“ wissen, wie es ist komplizierter als nur sagen, jemand „Use .ShowDialog()!“. Aber das ist die Methode (nicht .Show()), die Sie verwenden, um möchten Nutzung des zugrunde liegenden Fenster zu blockieren und den Code zu verhindern, fortgesetzt wird, bis das modale Fenster geschlossen wird.

Zuerst müssen Sie zwei WPF-Fenster. (Man wird das andere sein Aufruf.)

Aus dem ersten Fenster, lassen Sie uns sagen, dass war MainWindow.xaml genannt, in dessen Code-Behind wird:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

Dann Ihre Schaltfläche, um Ihre XAML hinzuzufügen:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />

Und Rechtsklick auf die Click Routine, wählen Sie „Gehe zu Definition“. Es wird schaffen es für Sie in MainWindow.xaml.cs:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}

In dieser Funktion müssen Sie die andere Seite mit seiner Seite Klasse angeben. Sagen Sie bitte Namen, die andere Seite „ModalWindow“, so dass seine Seite Klasse wird und ist, wie Sie würde (Call) instanziiert es:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();
}

Angenommen, Sie haben einen Wert, den Sie auf Ihrem modalen Dialog einstellen müssen. Erstellen Sie ein Textfeld und eine Schaltfläche in der ModalWindow XAML:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>

Dann einen Ereignishandler erstellen (ein anderes Click Ereignis) wieder und es verwenden, das Textfeld Wert auf eine öffentliche statische Variable auf ModalWindow zu speichern und this.Close() nennen.

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

Dann, nach Ihrer .ShowDialog() Anweisung, können Sie diesen Wert greifen und es verwenden:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}

Window.Show Fenster wird das Fenster anzuzeigen, und die Ausführung fortsetzen - es ist ein nicht-blockierenden Anruf

.

Window.ShowDialog den aufrufenden Thread Block (irgendwie [1]), und zeigen den Dialog. Es wird auch die Interaktion blockieren mit den Eltern / besitzen Fenster. Wenn der Dialog des Feldes verwiesen (forwhatever Grund) Showdialog an den Anrufer zurück, und ermöglicht es Ihnen, Dialogresult zugreifen (wenn Sie es wollen).

[1] Es wird der Dispatcher Pumpen halten durch einen Dispatcher Rahmen auf den WPF dipatcher schieben. Dadurch wird die Nachricht Pumpe führen Pumpen zu halten.

ein Window-Objekt myWindow gegeben, myWindow.Show () wird es öffnen modelessly und myWindow.ShowDialog () wird es modal öffnen. Aber auch diese nicht blockiert, von dem, was ich erinnere mich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top