Question

J'écris ma première application dans WPF et souhaite que l'utilisateur entre des données dans une boîte de dialogue modale. Apparemment, cela n’est pas simple à faire dans WPF, car la fenêtre parent reste entièrement activée et que la méthode qui a créé la nouvelle fenêtre enfant ne s’arrête pas et attend que la fenêtre enfant appelle Close (). Au lieu de cela, il continue d'avancer. Ce n'est pas ce que je veux.

Comment puis-je ouvrir la fenêtre enfant et laisser la fenêtre parent attendre que l'enfant se ferme avant que la fenêtre parent ne continue de s'exécuter?

Était-ce utile?

La solution

Avez-vous essayé d'afficher votre fenêtre à l'aide de ShowDialog méthode?

N'oubliez pas de définir le Propriété du propriétaire dans la fenêtre de dialogue de la fenêtre principale. Cela évitera un comportement étrange lorsque Alt + Tabbing, etc.

Autres conseils

Beaucoup de réponses sont simplistes et si quelqu'un commence WPF, il se peut qu'il ne connaisse pas tous les & "entrées et sorties &"; il est plus compliqué que de le dire à quelqu'un. & "Utilisez .ShowDialog()! &". Mais c’est la méthode (et non .Show()) que vous souhaitez utiliser pour bloquer l’utilisation de la fenêtre sous-jacente et empêcher le code de continuer jusqu’à la fermeture de la fenêtre modale.

Tout d’abord, vous avez besoin de 2 fenêtres WPF. (L'un appellera l'autre.)

À partir de la première fenêtre, supposons que cela s'appelle MainWindow.xaml. Dans son code-behind, il sera:

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

Ajoutez ensuite votre bouton à votre XAML:

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

Cliquez avec le bouton droit de la souris sur la Click routine, sélectionnez & "Aller à la définition &". Il le créera pour vous dans MainWindow.xaml.cs:

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

Dans cette fonction, vous devez spécifier l'autre page à l'aide de sa classe de page. Supposons que vous ayez nommé cette autre page & «ModalWindow &», Afin que celle-ci devienne sa classe de pages et que vous puissiez l'instancier (l'appeler):

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

Supposons que vous ayez une valeur à définir dans votre boîte de dialogue modale. Créez une zone de texte et un bouton dans le ModalWindow XAML:

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

Créez ensuite à nouveau un gestionnaire d'événements (un autre this.Close() événement) et utilisez-le pour enregistrer la valeur de la zone de texte dans une variable statique publique sur <=> et appeler <=>.

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

Ensuite, après votre <=> déclaration, vous pouvez récupérer cette valeur et l'utiliser:

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

    string valueFromModalTextBox = ModalWindow.myValue;
}

Window.Show Window affiche la fenêtre et continue l'exécution - il s'agit d'un appel non bloquant.

Window.ShowDialog bloquera le thread appelant (un peu [1]) et affichera la boîte de dialogue. Cela bloquera également les interactions avec la fenêtre parent / propriétaire. Lorsque la boîte de dialogue est fermée (quelle que soit la raison), ShowDialog reviendra à l'appelant et vous permettra d'accéder à DialogResult (si vous le souhaitez).

[1] Le répartiteur continuera à pomper en poussant un cadre de répartiteur sur le dipatcher WPF. Cela entraînera le message pompe continuer à pomper.

Étant donné un objet Window myWindow, myWindow.Show () l'ouvrira de manière modeste et myWindow.ShowDialog () l'ouvrira de manière modale. Cependant, même ce dernier ne bloque pas, de ce que je me souviens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top