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

WinUI 3 Template Studio页面切换总是重载,如何保留页面状态?

WinUI 3 Template Studio 页面切换保留内容的解决方法

核心原因

WinUI 3 Template Studio 默认的导航机制会在每次切换页面时创建新的页面实例,导致之前输入的内容随旧实例销毁而丢失。要保留内容,只需让页面实例被缓存,或把数据存储在持久化的ViewModel中。

方法一:设置页面导航缓存(最简单)

直接在目标页面的构造函数里开启导航缓存,让Frame自动缓存页面实例:

// PageA.xaml.cs
public PageA()
{
    this.InitializeComponent();
    // 开启页面缓存,切换时保留实例
    this.NavigationCacheMode = NavigationCacheMode.Enabled;
}

同样给PageB添加该设置,就能实现切换时保留各自页面的内容。如果需要在特定场景清理缓存,可以设置为NavigationCacheMode.Required,或手动调用Frame的RemoveFromCache方法。

方法二:通过ViewModel绑定保存数据(MVVM规范方式)

Template Studio生成的ViewModel默认是单例注册(在App.xaml.cs的服务注册中标记为Singleton),只要把输入控件的值绑定到ViewModel的属性,数据会随ViewModel持久化:

  1. 在PageA的ViewModel中添加绑定属性:
// PageAViewModel.cs
using CommunityToolkit.Mvvm.ComponentModel;

public partial class PageAViewModel : ObservableObject
{
    // 定义绑定的输入值属性
    [ObservableProperty]
    private int _inputValue;
}

([ObservableProperty]是MVVM Toolkit的特性,自动生成Get/Set和属性变化通知逻辑)

  1. 在PageA的XAML中绑定数字输入框:
<!-- PageA.xaml -->
<NumberBox Value="{x:Bind ViewModel.InputValue, Mode=TwoWay}" />

切换页面时ViewModel不会被销毁,InputValue的值会一直保留,切回PageA时输入框会自动加载保存的值。

方法三:修改导航服务实现页面缓存(自定义控制)

如果需要更灵活的缓存控制,可以修改NavigationService的逻辑,手动管理页面实例:

  1. 在Services/NavigationService.cs中添加缓存字典:
private readonly Dictionary<string, Page> _pageInstanceCache = new Dictionary<string, Page>();
  1. 修改NavigateTo方法,复用缓存的页面实例:
public bool NavigateTo(string pageKey, object parameter = null)
{
    if (!_pageKeyTypeMapper.TryGetValue(pageKey, out var pageType))
        return false;

    // 检查缓存中是否已有页面实例
    if (_pageInstanceCache.TryGetValue(pageKey, out var cachedPage))
    {
        if (Frame.Content != cachedPage)
        {
            // 复用缓存实例,禁用过渡动画(可选)
            Frame.Navigate(pageType, parameter, new SuppressNavigationTransitionInfo());
        }
        return true;
    }

    // 首次创建页面并加入缓存
    var page = (Page)_serviceProvider.GetService(pageType);
    _pageInstanceCache[pageKey] = page;
    return Frame.Navigate(pageType, parameter);
}

这种方法适合需要对页面实例生命周期做精细控制的场景,比如按需清理特定页面的缓存。

内容的提问来源于stack exchange,提问作者Jeremy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 05:29:58