Ich benutze Prism 5.0, und ich habe Probleme, es zu konfigurieren, um vorhandene Ansichten wiederzuverwenden. Immer wenn IRegionManager.RequestNavigate(string regionName, Uri source)
aufgerufen wird, erstellt es eine neue Ansicht, statt die Ansicht zu verwenden, die zuvor erstellt wurde. Seltsamerweise gibt CLRProfiler auch an, dass der Regionsmanager von Prism Verweise auf alle zuvor erstellten View-Instanzen hält, was zu einem Speicherleck führt.verhindern, dass Prism eine neue Ansicht für die Navigation erstellt
Meine Ansicht Modelle implementieren INavigationAware
, und true
in IsNavigationTarget()
zurückgeben, aber die Methode wird nie aufgerufen. Ich habe versucht, es mit demselben Ergebnis auch auf der Ansicht zu implementieren.
Als Test habe ich implementiert IActiveAware
auf der Ansicht, die zeigt, dass es deaktiviert ist, sobald ich zu einer anderen Ansicht navigieren (ich bin mir nicht sicher, ob das relevant ist).
Ich habe diese Frage gefunden: PRISM WPF - Navigation creates new view every time aber meine V-VM Namenskonventionen entsprechen denen der Antwort (ich benutze AutoFac, übrigens).
Ich habe nur eine Problemumgehung gefunden: Entfernen der aktiven Ansicht aus der Region mit NavigationContext.NavigationService.Region.Remove()
in der Implementierung des Ansichtsmodells INavigationAware.OnNavigatedFrom()
. Wenn ich das mache, gibt der Regionsmanager von Prism den Verweis auf die Ansicht frei. Dies funktioniert, aber es scheint ineffizient zu sein, die Ansicht immer neu zu erstellen, wenn sie benötigt wird.
Fast alle verwandten Fragen zu SO fragen, wie man eine neue Sicht auf ein Navigationsereignis erstellt, also nehme ich an, dass das Standardverhalten ist, dass Ansichten wiederverwendet werden. Ich brauche Hinweise hier.
EDIT
Wir verwenden Autofac der AutofacExtensions.RegisterTypeForNavigation<T>(this ContainerBuilder builder, string name = null)
die Ansichten zu registrieren. Wir verwenden IRegionManager.RequestNavigate()
für die Navigation zwischen Ansichten. INavigationAware
ist in ViewModels implementiert. Während jedoch INavigationAware.OnNavigatedTo()
und OnNavigatedFrom()
aufgerufen werden, wird IsNavigationTarget()
nie aufgerufen (das letztere wird nicht aufgerufen, selbst wenn die Ansichten INavigationAware
implementieren).
Ich kann erkennen, dass eine neue Ansicht erstellt wird, indem Sie einen Haltepunkt im Ctor der Ansicht festlegen. Ein CLRProfiler-Heap-Dump zeigt außerdem, dass der Regionsmanager so viele Instanzen der Ansicht enthält, wie oft er navigiert wurde. Die ViewModels werden nur einmal erstellt, da sie in AutoFac als Einzelinstanz registriert sind.
Als vorübergehende Maßnahme haben wir die Ansichten implementiert IRegionMemberLifetime
, wobei KeepAlive
false
zurückgibt. Dies ist nicht sehr effektiv, da die Ansichten jedes Mal neu erstellt werden, wenn sie benötigt werden. Es verhindert jedoch, dass der Regionsmanager an früheren Ansichten festhält.
müssen Sie IRegionMemberLifetime und KeepAlive-Eigenschaft verwenden. –
@AyyappanSubramanian Wenn die Ansicht IRegionMemberLifetime implementiert und KeepAlive true zurückgibt, behält der Regionsmanager einen Verweis auf die Ansicht bei, erstellt jedoch beim Navigieren einen neuen Verweis (dies muss der Standardwert sein, wenn die Ansicht IRML nicht implementiert). Wenn KeepAlive den Wert false zurückgibt, wird die Ansicht verworfen und muss neu erstellt werden. Meine Frage war, wie Prism die ursprüngliche Ansicht wiederverwenden kann, also ist dies keine Lösung. – Drew
Ich habe derzeit das gleiche Problem, aber nicht auf alle meine Ansichten. Es scheint irgendetwas unter einer bestimmten Seite zu sein, was mir Probleme bereitet. – user3265613