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

Windows.UI.Xaml.Controls.Frame为何无法清除上次导航参数?

UWP Frame导航参数残留问题解析

核心原因

UWP的Frame控件默认会缓存页面实例。当你第一次带参数导航到MyPage后,该页面实例会被存入导航缓存。后续调用Frame.Navigate(typeof(MyPage))时,系统会直接复用这个已缓存的实例,而非创建新页面,此时OnNavigatedTo方法收到的参数就是第一次导航时传入的旧值——哪怕你这次没传参数。

参数存储位置

  1. 页面实例自身:如果原开发者在MyPage类里定义了字段存储导航参数(比如private object _navParam;),这个字段会在第一次导航时被赋值,复用实例时不会自动清空。
  2. Frame的导航栈:Frame.BackStack或Frame.ForwardStack中的PageStackEntry对象,每个条目都记录了对应导航的SourcePageType和Parameter。当复用页面时,系统会从对应栈条目中取出参数传递给OnNavigatedTo。

解决/清除方法

  • 禁用页面缓存:在MyPage的XAML中设置NavigationCacheMode="Disabled",或者在页面构造函数里添加代码:
    this.NavigationCacheMode = NavigationCacheMode.Disabled;
    
    这样每次导航都会创建新的页面实例,参数不会残留。
  • 清理导航栈旧条目:如果不需要保留MyPage的历史导航记录,可以在导航前清理栈中对应的条目:
    var oldEntries = Frame.BackStack.Where(entry => entry.SourcePageType == typeof(MyPage)).ToList();
    foreach (var entry in oldEntries)
    {
        Frame.BackStack.Remove(entry);
    }
    
  • 手动重置页面状态:在MyPage的OnNavigatedTo方法里,主动判断本次导航是否需要参数。如果是无参数调用进入,手动重置页面内和参数相关的状态,忽略传入的旧参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:15:02