2017-06-06 85 views
0

我正在嘗試Prism,並創建了一個簡單的應用程序,包括一個帶有Prism區域的主窗口以及兩個「子」視圖(和VM)。每一個這些子視圖有一個按鈕,點擊此簡單地導航到其他視圖,如:如何在使用棱鏡導航時處理視圖?

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

子視圖和視圖模型實現IDisposable,在我的DI容器都被賦予了「瞬時」一生。此外,視圖實現IRegionMemberLifetime(KeepAlive = false)。

儘管這一切,意見沒有得到安置(直到我關閉應用程序)。我錯過了什麼?當我離開它時,如何處理視圖?

或者,它會更簡單註冊子視圖作爲單身人士和初始化他們時,我瀏覽到他們嗎?

+0

如果我理解正確,你真正的問題是,當你導航到另一個視圖,舊的視圖仍然需要內存?你有沒有試過只調用GC.Collect()? – jannagy02

+0

@ jannagy02我剛剛嘗試過(在調用RequestNavigate()之後),但它仍然不會導致視圖被丟棄。 –

回答

1

如果您期待您的IDisposable的方法來火,這是你使用的是什麼,以確定是否你的意見被「佈置」,那麼你就錯了。這不是它的工作原理。 GC在準備就緒後將完成其工作。如果您正在使用IRegionMemberLifetime,那麼您正在執行所需的操作,以便從區域中刪除視圖並將其用於GC。你會想做一些關於IDisposable的研究,以及它如何在WPF中工作。

+0

是的,我想我正在等待Dispose()在導航離開後很快被調用。我一直在做這項工作足夠長的時間,所以現在應該更清楚地知道GC不能像那樣工作。 –

+1

是的,該死的GC很煩人,尤其是在WPF中工作。只要您實施IRegionMemberLifetime,視圖就會從區域中移除並準備收集。您可以通過檢查區域管理器進行驗證。別擔心,你做對了。 –

+0

我使用的是溫莎城堡,我唯一擔心的可能是某處某處沒有連接來釋放視圖。正如在前面的評論中提到的,我嘗試調用'GC.Collect()',但是我仍然沒有看到Dispose()方法被調用 - 但這又可能歸結於我對GC的不瞭解。 –