2010-07-23 6 views
4

Quelque contexte ici ... J'ai un System.Windows.Window qui est utilisé pour afficher une boîte de message modale. J'ai créé une méthode Show() qui initialise le contenu de la fenêtre, puis appelle ShowDialog(). L'utilisateur clique sur un bouton de cette fenêtre, certaines informations sur le bouton cliqué sont définies dans la propriété Tag, puis la fenêtre est fermée via Close().Est-il possible de réafficher et de fermer la fenêtre de dialogue?

Comme prévu, je reçois une exception ShowDialog lorsque vous essayez d'appeler ShowDialog() sur la fenêtre une fois qu'il a été fermé. Y a-t-il un moyen de réutiliser cette même instance de fenêtre de sorte que je n'ai pas à renouveler une instance chaque fois que j'ai besoin d'une boîte de message?

Par exemple ...

MessageBoxWindow mbw = new MessageBoxWindow(); 
result = mbw.Show("caption", "message 1"); 

mbw.Show("caption", "message 2"); 
// The above throws an exception, so I have to do this... 
mbw = new MessageBoxWindow(); 
result = mbw.Show("caption", "message 2"); 

Toute aide serait grandement appréciée!

Répondre

2

Utilisez .Hide() au lieu de .Close(). Cela l'enlève sans le détruire. Ensuite, vous pouvez appeler à nouveau Show() si nécessaire.

MainWindow test = new MainWindow(); 
    test.Show(); 
    test.Hide(); 
    test.Show(); 
+0

Merci! Solution très simple qui fonctionne pour le problème que je devais résoudre. – geoffmazeroff

0

Vous pouvez ajouter un événement FormClosing qui annule le formulaire close et définit à la place la valeur Form.Visible sur false. Ensuite, vous aurez également besoin de la méthode Show qui vérifie si ce formulaire est nul, donc vous saurez si vous avez besoin de créer un nouveau formulaire ou simplement afficher celui que vous avez déjà.

Par exemple:

private void FormMessageBox_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    //This stops the form from being disposed 
    e.Cancel = true; 
    this.Visible = false; 
} 

public static void Show(FormMessageBox formMessageBox, string message) 
{ 
    //if formMessageBox is null we need to create a new one otherwise reuse. 
    if (formMessageBox == null) 
    { 
    formMessageBox = new FormMessageBox(message); 
    formMessageBox.ShowDialog(); 
    } 
    else 
    { 
    formMessageBox.lblMessage.Text = message; 
    formMessageBox.Visible = true; 
    } 
} 
+0

Au lieu d'utiliser Visible vous pouvez utiliser les méthodes Hide() et Show() avec cette approche ainsi que suggéré dans la réponse de Jay – Jack

+0

Cette solution est probablement la méthode la plus complète pour résoudre le problème en utilisant les événements relatifs à la fenêtre. Malheureusement, mon chef d'équipe a déclaré que pour que la boîte de message soit compatible avec notre IoC, les méthodes statiques ont tendance à être problématiques. Si l'IoC n'était pas dans l'image, j'utiliserais cette solution. Merci! – geoffmazeroff

+0

Si c'est uniquement la méthode statique (et non les gestionnaires d'événements) qui pose problème, la méthode show n'a pas besoin d'être statique. Je l'ai seulement rendu statique parce que la façon dont je l'ai écrit lui permettait d'être statique. Force d'habitude je suppose. – Jack