You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:18:15