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持久化:
- 在PageA的ViewModel中添加绑定属性:
// PageAViewModel.cs using CommunityToolkit.Mvvm.ComponentModel; public partial class PageAViewModel : ObservableObject { // 定义绑定的输入值属性 [ObservableProperty] private int _inputValue; }
([ObservableProperty]是MVVM Toolkit的特性,自动生成Get/Set和属性变化通知逻辑)
- 在PageA的XAML中绑定数字输入框:
<!-- PageA.xaml --> <NumberBox Value="{x:Bind ViewModel.InputValue, Mode=TwoWay}" />
切换页面时ViewModel不会被销毁,InputValue的值会一直保留,切回PageA时输入框会自动加载保存的值。
方法三:修改导航服务实现页面缓存(自定义控制)
如果需要更灵活的缓存控制,可以修改NavigationService的逻辑,手动管理页面实例:
- 在
Services/NavigationService.cs中添加缓存字典:
private readonly Dictionary<string, Page> _pageInstanceCache = new Dictionary<string, Page>();
- 修改
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
相关产品推荐
相关产品推荐

