2017-06-06 2 views
0

J'expérimente avec Prism et ai créé une application simple consistant en une fenêtre principale avec une région de Prism, avec deux vues «d'enfant» (et VMs). Chacune de ces vues de l'enfant a un bouton, et en cliquant sur ce navigue simplement à l'autre point de vue, par exemple:Comment puis-je disposer d'une vue lorsque je navigue avec Prism?

_regionManager.RequestNavigate("MainWindowRegion", "HomeView"); 

Les vues de l'enfant et les modèles de vue de mettre en œuvre IDisposable, et ont été donné une vie « transitoire » dans mon conteneur DI . En outre, les vues implémentent IRegionMemberLifetime (KeepAlive = false).

Malgré tout cela, les vues ne sont pas disposées (jusqu'à ce que je ferme l'application). Qu'est-ce que je rate? Comment puis-je disposer d'une vue lorsque je m'en éloigne?

Ou serait-il plus simple d'enregistrer les vues enfant sous forme de singletons et de les initialiser chaque fois que je navigue vers elles?

+0

Si je comprends bien, votre vrai problème est que lorsque vous naviguez vers une autre vue, l'ancienne vue prend toujours la mémoire? Avez-vous essayé d'appeler GC.Collect()? – jannagy02

+0

@ jannagy02 Je viens d'essayer ceci (après les appels à 'RequestNavigate()') mais cela n'aboutit toujours pas à la suppression des vues. –

Répondre

1

Si vous attendez que vos méthodes IDisposable se déclenchent et que vous les utilisiez pour déterminer si vos vues sont "éliminées", vous vous trompez. Ce n'est pas comme ça que ça fonctionne. Le GC fera son travail quand il sera prêt. Si vous utilisez IRegionMemberLifetime, vous effectuez ce dont vous avez besoin pour supprimer la vue de la région et la rendre disponible pour GC. Vous voudrez faire quelques recherches sur IDisposable et comment cela fonctionne dans WPF.

+0

Oui, j'imagine que je m'attendais à ce que Dispose() se fasse appeler assez vite après avoir quitté. J'ai fait ce travail assez longtemps et je devrais savoir maintenant que le GC ne fonctionne pas comme ça. –

+1

Ouais, ce foutu GC est agaçant de travailler surtout avec WPF. Tant que vous implémentez IRegionMemberLifetime, les vues sont supprimées de la région et prêtes pour la collecte. Vous pouvez vérifier en vérifiant le gestionnaire de région. Ne vous inquiétez pas, vous le faites correctement. –

+0

J'utilise Castle Windsor, et ma seule inquiétude est que quelque chose n'est peut-être pas connecté pour libérer les vues. Comme mentionné dans un commentaire précédent, j'ai essayé d'appeler 'GC.Collect()' mais je ne vois toujours pas les méthodes Dispose() appelées - mais cela pourrait encore être dû à ma mauvaise compréhension de GC. –