Comment créer un dialog modal dans WPF?

J’écris ma première application dans WPF et souhaite que l’utilisateur saisisse certaines données dans une fenêtre de dialog modale. Apparemment, ce n’est pas simple à faire dans WPF, car la fenêtre parente rest entièrement activée et 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 ne fait que continuer. Ce n’est pas ce que je veux.

Comment puis-je ouvrir la fenêtre enfant et faire en sorte que la fenêtre parente attende la fermeture de l’enfant avant que la fenêtre parente ne continue à s’exécuter?

Avez-vous essayé de montrer votre fenêtre en utilisant la méthode ShowDialog ?

N’oubliez pas de définir la propriété Owner dans la fenêtre de dialog sur la fenêtre principale. Cela évitera les comportements étranges lorsque Alt + Tabbing, etc.

Window.Show Window affiche la fenêtre et continue l’exécution – c’est un appel non bloquant.

Window.ShowDialog va bloquer le thread appelant (kinda [1]) et afficher la boîte de dialog. Il bloquera également l’interaction avec la fenêtre parente / propriétaire. Lorsque la boîte de dialog est rejetée (pour quelque raison que ce soit), ShowDialog retourne à l’appelant et vous permet d’accéder à DialogResult (si vous le souhaitez).

[1] Cela permet au répartiteur de continuer à pomper en poussant un répartiteur sur le dipatcher WPF. Cela entraînera le pompage de la pompe à messages.

Beaucoup de ces réponses sont simplistes et si quelqu’un commence WPF, il se peut qu’il ne connaisse pas tous les “ins-and-outs”, car c’est plus compliqué que de dire à quelqu’un “Use .ShowDialog() !”. Mais c’est la méthode (pas .Show() ) que vous souhaitez utiliser pour bloquer l’utilisation de la fenêtre sous-jacente et empêcher que le code continue jusqu’à ce que la fenêtre modale soit fermée.

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

Dans la première fenêtre, disons que MainWindow.xaml, dans son code-behind sera:

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

Ajoutez ensuite votre bouton à votre XAML:

  

Et cliquez avec le bouton droit sur la routine Click , 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 en utilisant sa classe de page. Disons que vous avez nommé cette autre page “ModalWindow”, qui devient donc sa classe de page et comment vous l’instanciez (appelez):

 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 dialog modale. Créez une zone de texte et un bouton dans le XAML de ModalWindow :

     

Ensuite, créez à nouveau un gestionnaire d’événements (un autre événement Click ) et utilisez-le pour enregistrer la valeur de la zone de texte dans une variable statique publique sur ModalWindow et appelez this.Close() .

 public partial class ModalWindow : Window { public static ssortingng myValue = Ssortingng.Empty; public ModalWindow() { InitializeComponent(); } private void btnSaveData_Click(object sender, RoutedEventArgs e) { myValue = txtSomeBox.Text; this.Close(); } } 

Ensuite, après votre .ShowDialog() , vous pouvez saisir cette valeur et l’utiliser:

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

Étant donné un object Window myWindow, myWindow.Show () l’ouvrira de façon modeste et myWindow.ShowDialog () l’ouvrira de manière modale. Cependant, même ce dernier ne bloque pas, d’après mes souvenirs.