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
相关产品推荐
相关产品推荐

