需求:當前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,只顯示歡迎頁。