WinUI 3中如何从Frame访问缓存的页面实例?
解决Frame缓存页面实例获取问题
方法一:导航时缓存实例到字典
在主窗口类里维护一个字典存储缓存页面的实例,第一次导航到目标页面时捕获实例并存入,后续直接从字典调用:
// 主窗口类私有字段 private Dictionary<Type, Page> _cachedPages = new Dictionary<Type, Page>(); // NavigationView导航事件处理示例 private void NavigationView_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args) { Type pageType = args.InvokedItem switch { "数据页面1" => typeof(DataPage1), "数据页面2" => typeof(DataPage2), _ => typeof(HomePage) }; if (!_cachedPages.TryGetValue(pageType, out Page targetPage)) { targetPage = (Page)Activator.CreateInstance(pageType); // 根据平台设置缓存模式:UWP用NavigationCacheMode.Enabled,WPF用NavigationCacheMode.Required targetPage.NavigationCacheMode = NavigationCacheMode.Enabled; _cachedPages.Add(pageType, targetPage); } MainFrame.Navigate(pageType); }
提取数据时直接从字典获取实例:
private void SaveData() { if (_cachedPages.TryGetValue(typeof(DataPage1), out DataPage1 page1)) { var data1 = page1.GetFormData(); // 假设页面有自定义方法返回数据 // 执行保存逻辑 } if (_cachedPages.TryGetValue(typeof(DataPage2), out DataPage2 page2)) { var data2 = page2.GetFormData(); // 执行保存逻辑 } }
方法二:遍历Frame导航栈获取实例
如果缓存页面已在Frame的后退/前进栈中,可遍历栈条目提取实例:
private T GetCachedPage<T>() where T : Page { // 先检查当前显示页面 if (MainFrame.Content is T currentPage) { return currentPage; } // 遍历后退栈 foreach (var entry in MainFrame.BackStack) { if (entry.Content is T page) { return page; } } // 遍历前进栈 foreach (var entry in MainFrame.ForwardStack) { if (entry.Content is T page) { return page; } } return null; } // 调用示例 private void SaveData() { var page1 = GetCachedPage<DataPage1>(); var page2 = GetCachedPage<DataPage2>(); if (page1 != null) { // 提取并保存数据 } }
关键注意事项
- 必须确保页面的
NavigationCacheMode配置正确,否则Frame不会缓存实例。 - 用字典缓存时,要在页面
Unloaded事件中移除对应条目,避免内存泄漏。 - 若Frame设置了
CacheSize,超出限制的缓存页面会被销毁,此时字典中的实例需同步清理。
内容的提问来源于stack exchange,提问作者samgido
相关产品推荐
相关产品推荐

