WinRT/UWP 幀和頁面記憶體:如何在 Navigate() 上創建新頁面實例並將頁面實例保留在 GoBack() 上
我正在嘗試使用 C# 創建一個 UWP(通用 Windows 應用程序)應用程序。我的問題是
Frame控制項:如果我在沒有 的情況下使用它NavigationCacheMode = Required,則每次使用者返回時,頁面都不會保存在記憶體中,而是會重新創建。如果我設置NavigationCacheMode為RequiredorEnabled,返回可以正常工作(沒有新的頁面對象),但是如果我從相同類型導航到另一個頁面,則前一個頁面對象將被回收和重用(沒有新的頁面實例)。期望的行為:
有沒有辦法使原始控制項具有以下行為
Frame(例如在 Windows Phone 中):
- 創建新的頁面實例
Navigate()- 保持頁面實例開啟
GoBack()我知道的唯一解決方案是創建一個自己的
Frame控制項,但這會導致其他問題(例如:缺少SetNavigationState()方法等……)範例場景:
具有三個頁面的簡單應用範例:
TvShowListPage、TvShowDetailsPage、SeasonDetailsPage。
TvShowListPage是入口頁面。點擊TvShow導航到後TvShowDetailsPage。- 現在在
TvShowDetailsPage列表中選擇一個季節並導航到TvShowDetailsPage.- 如果向後導航,頁面應保留在記憶體中以避免重新載入頁面。
- 但是,如果使用者返回
TvShowListPage並選擇另一個TvShow,TvShowDetailsPage則會被回收並且可能處於錯誤狀態(例如,顯示演員樞軸而不是第一個,季節樞軸)我正在尋找預設的 Windows Phone 7 行為:導航在頁面堆棧上創建一個新頁面,返回從堆棧中刪除頂部頁面並顯示堆棧中的前一頁(儲存在記憶體中)。
解決方案:
因為沒有解決這個問題,我不得不重新實現所有與分頁相關的類:Page、Frame、SuspensionManager 等…
提供所有這些類的庫 MyToolkit可以在這裡下載:https ://github.com/MyToolkit/MyToolkit/wiki/Paging-Overview
參考:
- <http://www.jayway.com/2012/05/25/clearing-the-windows-8-page-cache/>:沒有好的解決方案
- <http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/88e6d1b3-1fa6-4ab4-a816-e77c86ef236f/>:實現自己的 Frame 類不是解決方案,因為它不適用於
SuspensionManager
因為沒有解決這個問題,我不得不重新實現所有與分頁相關的類:Page、Frame、SuspensionManager 等…
該解決方案可以在這裡下載: https ://github.com/MyToolkit/MyToolkit/wiki/Paging-Overview
更新:
頁麵類現在還提供OnNavigatingFromAsync方法來顯範例如非同步彈出視窗並在需要時取消導航……