需求:当前frame已经打开了很多page,除了首页welcome其他page都要关闭
分析:frame提供了RemoveBackEntry方法,但是仅限于删除回退部分,如果当前页到历史导航中间或者第一页,会导致无法清除历史导航,所以思路是让frame回到最前页,也就是CanGoForward必须为false,代码如下:
1 while (this.Frame.CanGoForward) 2 { 3 this.Frame.GoForward(); 4 }
通过不停的调用GoForward(),实现frame回到最前页,然后执行RemoveBackEntry,但是有个问题,如下图
当前页如果是权限管理,清空导航历史后,当前页权限管理还是显示,如果当前选择的欢迎页,没有问题,只会留下欢迎页,国内外并没有相关资料处理这种情况,为了实现目标,
想了一个方案:首先让frame回到最前页,然后跳转到欢迎页,然后关闭所有。但是问题还是有,代码如下
1 while (this.Frame.CanGoForward) 2 { 3 this.Frame.GoForward(); 4 } 5 var entry = this.Frame.RemoveBackEntry(); 6 while (entry != null) 7 { 8 entry = this.Frame.RemoveBackEntry(); 9 } 10 this.Frame.Navigate(new Uri("View/Main/Views/Welcome.xaml", UriKind.RelativeOrAbsolute));
可是出现个问题,frame来不及跳转到welcome,就已经执行完了清楚导航历史,哪怕把
this.Navigate(new Uri("View/Main/Views/Welcome.xaml", UriKind.RelativeOrAbsolute));
放在第一行 while (this.Frame.CanGoForward)之前都不行,仔细翻看了一个 Frame官方文档,如下图
于是想到可以在LoadCompleted之后执行清除导航历史操作,毕竟LoadCompleted保证了page加载完成,
总结实现思路:首先让frame回到最前页,然后跳转到欢迎页,等LoadCompleted完成后执行清除导航历史操作(注意:并不是所有的LoadCompleted都清除导航历史,否则后果就是你永远只有欢迎页,其他页刚打开就被关了)
1 while (this.Frame.CanGoForward) 2 { 3 this.Frame.GoForward(); 4 } 5 this.Frame.LoadCompleted += Frame_LoadCompleted;//添加清除操作 6 this.Frame.Navigate(new Uri("View/Main/Views/Welcome.xaml", UriKind.RelativeOrAbsolute));
1 private void Frame_LoadCompleted(object sender, NavigationEventArgs e) 2 { 3 var entry = this.Frame.RemoveBackEntry(); 4 while (entry != null) 5 { 6 entry = this.Frame.RemoveBackEntry(); 7 } 8 this.Frame.LoadCompleted -= Frame_LoadCompleted;//完成清除导航后,删除清除操作 9 }
总结:不管当前导航打开的什么页,以及导航位置不管在哪,都会清除所有page,只显示欢迎页。