2009-08-06 3 views
2

J'ai une occurrence de fenêtre que je montre en appelant wInstance.ShowDialog() à partir d'un clic de bouton et je ferme la fenêtre en appuyant sur Alt + F4. Le problème est maintenant que je ne peux pas appeler wInstance.ShowDialog() à nouveau. Comment puis-je réutiliser la même instance de fenêtre à nouveau.Existe-t-il un moyen de réutiliser une instance de fenêtre WPF déjà fermée?

Exception: Impossible de définir la visibilité ou appeler Show ou ShowDialog après la fermeture de la fenêtre.

+0

duplication possible de [WPF: ne peut pas réutiliser la fenêtre après qu'elle a été fermée] (http://stackoverflow.com/questions/3568233/wpf-cannot-reuse-window-after-it-has-been-closed) – nemesv

+0

Cela ne peut pas être un doublon d'un post plus récent ... sûrement ce post est une copie de celui-ci? – Sheridan

Répondre

9

Vous devez remplacer la méthode wInstance OnClosing pour définir la visibilité de la fenêtre sur hidden et annuler l'événement close.

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     this.Visibility = Visibility.Hidden; 
     e.Cancel = true; 
    } 
+0

Merci Martin, c'est la réponse à une question que je me posais l'autre jour. – Dennis

+0

J'ai le même problème ici et bien que ceci ait arrêté l'exception quand j'essaye d'utiliser la fenêtre encore, il empêche le ShowDialog() de renvoyer vrai quand je m'attendrais. Avez-vous des suggestions à ce sujet? –

+0

Le retour de ShowDialog() indique comment la boîte de dialogue a été éliminée. Si cette information est importante pour vous, alors vous devrez disposer de la fenêtre quand elle est fermée, donc vous ne devriez pas annuler l'événement close, et instancier une nouvelle fenêtre lorsque vous voulez le rouvrir. Si les informations sur l'état de la fenêtre sont importantes, considérez le motif mémento. –

1

Qu'est-ce qui fait qu'il est si important d'utiliser la même fenêtre? Si vous utilisez MVVM, vous pouvez simplement réutiliser le viewmodel pour une nouvelle fenêtre.

+0

Mais je veux éliminer le coût d'une nouvelle création d'instance de fenêtre. Donc, vérifier s'il existe une portée de réutilisation et utiliser à nouveau ShowDialog() sur l'instance. –

+0

Votre fenêtre est-elle si chère à créer? – Botz3000

+0

La réponse de Martin Doms est correcte, mais je suis très curieux à propos de cette question moi-même. Est-il possible que vous surestimiez le temps de création de cette vue, surtout si vous utilisez MVVM et que vous gardez la VM autour? –

0

Je suis réutilisant une fenêtre comme une boîte de dialogue qui utilise un TreeView et le client veut que les branches d'arbres restent ouvertes pendant plusieurs sélections.

Le remplacement a fonctionné pour la réutilisation et les branches restent étendues.

Je n'utilise pas de modèle de vue pour rester simple car il s'agit d'une boîte de dialogue de sélection en lecture seule. Mais comme je n'arrive pas à effacer la sélection pour le moment, je devrais peut-être passer à un modèle de vue.

Questions connexes