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

WPF 非MVVM模式下点击TreeView超链接如何重新加载相同页面

WPF Frame重复导航同Uri不重载页面解决方案

问题根因

WPF的Frame控件默认启用了导航页面缓存机制,当重复导航到已访问过的Uri时,会直接复用缓存的页面实例,不会重新触发页面的构造函数和InitializeComponent()方法,与Web页面每次点击重新加载的逻辑不一致。

可用解决方案

根据你的业务场景可以选择以下任意一种方案:

方案1:全局禁用Frame缓存(适合所有页面需每次重载的场景)

直接修改导航代码,设置Frame的CacheSize属性为0,关闭所有页面缓存即可:

private void MnuMain_RequestNavigate(object sender, 
    System.Windows.Navigation.RequestNavigateEventArgs e)
{
    // 0表示不缓存任何导航页面
    this.MainContent.CacheSize = 0;
    this.MainContent.Content = null;
    this.MainContent.Resources.Clear();
    this.MainContent.Navigate(e.Uri, UriKind.RelativeOrAbsolute);
}

方案2:单页面禁用缓存(灵活适配部分页面需重载的场景)

如果不需要所有页面都每次重载,仅需给要每次重新加载的Page的XAML根节点添加KeepAlive="False"属性即可:

<Page x:Class="你的项目命名空间.对应页面类名"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      KeepAlive="False">
    <!-- 页面业务内容 -->
</Page>

方案3:直接实例化页面导航(100%确保每次生成新实例)

如果不想依赖框架缓存配置,可以绕过Uri导航逻辑,每次手动实例化页面对象传入Navigate方法:

private void MnuMain_RequestNavigate(object sender, 
    System.Windows.Navigation.RequestNavigateEventArgs e)
{
    // 根据Uri映射得到对应页面类,示例为xaml文件名和类名一致的场景
    string pageClassName = e.Uri.OriginalString.Replace(".xaml", string.Empty);
    Type pageType = Type.GetType($"你的项目命名空间.{pageClassName}");
    object newPage = Activator.CreateInstance(pageType);
    
    this.MainContent.Content = null;
    this.MainContent.Resources.Clear();
    this.MainContent.Navigate(newPage);
}

以上任意一种方案修改完成后,重复点击同一超链接都会重新触发页面构造函数执行,实现类似Web页面每次点击重新加载的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:27:04