2012-12-26 12 views
7

Podczas nawigacji między stronami widzę, że istnieją funkcje pozwalające na powrót/do przodu lub na stronę "home". Potrzebuję jednak móc wrócić, ale pomijać strony, których użytkownik nie powinien już odwiedzać. Przeszukałem i znalazłem następujące: http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/3819f389-3bfc-4c59-a919-272927fc9229Strony pop off stos nawigacyjny w aplikacji Windows 8 App

Próbowałem używać GetNavigationStack, ale ciągle się zawiesza z powodu braku możliwości serializacji i przekazania obiektu jako parametru NavigationParameter. Aby przekazać 2 parametry, muszę użyć Tuple, ale nie można tego zrobić serializacją, więc nie mogę pobrać stosu nawigacyjnego, aby go edytować i ręcznie usunąć strony.

Potem uznał ten WinRT - How to ignore or delete page from navigation history i że mogłaby zawierać wartość logiczną, która może być ustawiony, jeśli strona miała być pomijane

W LayoutAwarePage.cs (klasa wszystkie ekrany dziedziczyć, generowane przez Visual Studio) Dodałem protected bool CanGoBackToThisPage { get; set; }, które można ustawić, jeśli nie chcesz odwiedzać tej strony, ale jest też problem z tym, ponieważ czasami nie wiem, czy chcesz ponownie odwiedzić stronę, dopóki nie zrobisz czegoś na bieżącej stronie . Nie sądzę, że możesz zrobić coś takiego, jak previousFrame.CanGoBackToThisPage = true. Poza tym obiekt Frame, do którego masz dostęp, nie ma (jak sądzę) dostępu do rzeczywistych obiektów strony, ale raczej do obiektu podsumowującego i nie wiem, w jaki sposób uzyskać tę wartość logiczną w tym obiekcie podsumowania.

Czy ktoś wie o prosty sposób usunięcia poprzedniej/bieżącej strony ze stosu nawigacji? Wygląda na to, że byłby to bardzo powszechny problem, więc trudno mi myśleć, że Microsoft nie dał nam tego sposobu.

Dzięki

+1

Próba ręcznego edytowania historii nawigacji to zły pomysł. Możesz po prostu przejść wstecz, a następnie sprawdzić, czy powinieneś kontynuować nawigację wstecz. – mydogisbox

Odpowiedz

5

ok, nie wiem, dlaczego nie pomyśleć o tym zanim wyślesz pytanie. Może jestem po prostu zmęczony.

właśnie nazywa Frame.GoBack() dwukrotnie, a następnie nawigować do strony chcę iść do:

// 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); 

Chyba myśli nazywając GoBack() faktycznie zrobić stronę ożywione do poprzedniego, ale tak nie jest

+0

Nawigacja jest wystarczająco szybka, aby nie zauważyć animacji, ale zdarzenie loadstate jest wyzwalane (a więc logika zostanie wykonana). – Bart

+0

Jeśli wiesz, że zawsze podnosisz dwa poziomy, myślę, że możesz po prostu pominąć wywołania funkcji GoBack() i dodać następujący kod na stronie, do której nawigujesz w metodzie stanu obciążenia: "if (Frame.BackStack. Any()) {Frame.BackStack.Clear();} " –

-1

jeśli korzystasz z nawigacji po ramce, wykonaj to.Frame.BackStack.Usuń stan ładowania nowej ramki i wyczyść poprzednie strony.

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

Chociaż muszę dać rekwizyty gvmani, ponieważ jego odpowiedź pomogła, choć nie była kompletna.

Pozwoli to uniknąć wyżej wymienionych problemów z wyzwalanym zdarzeniem loadstate i jest bardziej eleganckim rozwiązaniem.

2

wpadłem na ten sam problem i rozwiązali to poprzez usunięcie bieżącej strony z BackStack po opuścisz:

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

Użyłem NavigationCacheMode aby uniknąć wielokrotnej instancji został stworzony podczas przejść do innych stronie w ramce .

public SamplePage() 
    { 
     this.InitializeComponent(); 
     this.NavigationCacheMode = global::Windows.UI.Xaml.Navigation.NavigationCacheMode.Required; 
    } 
Powiązane problemy