2012-12-26 37 views
7

在頁面之間導航時,我發現有些功能可以讓您返回/前進或進入「主頁」頁面。但是,我需要的是能夠返回,但跳過用戶不應再訪問的頁面。我周圍搜索,發現以下內容:http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/3819f389-3bfc-4c59-a919-272927fc9229在Windows 8中關閉導航堆棧的頁面應用程序

我嘗試使用GetNavigationStack,但由於無法序列化和對象作爲NavigationParameter傳遞,因此它保持失敗。我不得不使用Tuple傳遞2個參數,但是這不能被序列化,所以我無法讓導航堆棧編輯它並手動刪除頁面。

然後我發現這個WinRT - How to ignore or delete page from navigation history,我想我可以包括可設置一個布爾值,如果頁面被跳過

LayoutAwarePage.cs(類所有的屏幕繼承,由Visual Studio生成的)我說protected bool CanGoBackToThisPage { get; set; }如果你不想訪問這個頁面,可以設置它,但也有一個問題,因爲有些時候我不知道你是否希望能夠再次訪問一個頁面,直到你在當前頁面上做了一些事情。我不認爲你可以做類似previousFrame.CanGoBackToThisPage = true的事情。此外,您有權訪問的Frame對象沒有(我認爲)可以訪問實際的頁面對象,但是有一些摘要對象,而我不知道如何將該布爾值存入該摘要對象。

有誰知道一個簡單的方法來從導航堆棧中刪除前一頁/當前頁面?這似乎是一個非常常見的問題,所以我很難想到微軟並沒有給我們一些方法。

感謝

+1

試圖手動編輯導航歷史記錄是一個壞主意。您可能只需導航一個,然後檢查是否應該繼續向後導航。 – mydogisbox

回答

5

好吧,我不知道爲什麼我沒有張貼問題之前,想起來了。也許我只是累了。

我剛打電話Frame.GoBack()兩次,然後導航到我想去的頁面:

// If the user presses back we don't want them to visit this page or the previous page they were on so remove them from the navigation stack 
Frame.GoBack(); 
Frame.GoBack(); 

// Go to the detail page 
this.Frame.Navigate(typeof(GroupDetailPage), mGroup); 

我猜我想打電話GoBack()實際上會使頁面動畫前一個,但它不

+0

導航足夠快,不會注意到動畫,但觸發了loadstate事件(因此會執行邏輯)。 – Bart

+0

如果你知道你總是上升到兩個級別,我想你可以跳過對GoBack()的調用,並將下面的代碼添加到您在其加載狀態方法中導航到的頁面中:「if(Frame.BackStack。任何()){Frame.BackStack.Clear();}「 –

-1

如果您使用的是框架導航,請執行this.Frame.BackStack.Remove在新框架的裝載狀態並清除以前的頁面需要的。

3
Frame.BackStack.RemoveAt(Frame.BackStack.Count - 1); 

雖然我不得不給予gvmani道具,因爲他的回答很有幫助,雖然它不是很完整。

這樣可以避免上面提到的LoadState事件被觸發時出現的問題,這是一個更加優雅的解決方案。

2

我遇到了同樣的問題,並從堆棧中刪除當前頁面解決了這個導航離去後:

protected override void OnNavigatedFrom(NavigationEventArgs e) 
{ 
    base.OnNavigatedFrom(e); 

    // Remove current page from history 
    var pageStackEntry = Frame.BackStack.Last(entry => entry.SourcePageType == this.GetType()); 
    Frame.BackStack.Remove(pageStackEntry); 
} 
0

我已經使用NavigationCacheMode以避免多個實例創建,而導航到框架的其他頁面。

public SamplePage() 
    { 
     this.InitializeComponent(); 
     this.NavigationCacheMode = global::Windows.UI.Xaml.Navigation.NavigationCacheMode.Required; 
    } 
相關問題