2010-10-12 11 views
5

Zawsze, gdy mój program jest zamykany przez tombstoning, po jego reaktywacji chciałbym, aby aplikacja powróciła do ekranu startowego.Nawigacja w aplikacji Aktywny Windows Phone 7 (Tombstoning)

chciałbym zrobić coś takiego

private void Application_Activated(object sender, ActivatedEventArgs e) { NavigationService.Navigate(new Uri("/Start.xaml", UriKind.Relative));
}

ale to nie działa. Dzięki, Shureman.

Odpowiedz

5

To nie jest ogólnie akceptowane zachowanie w pobliżu tombstoningu. Oczekuje się, że aplikacja powróci dokładnie tak, jak była, gdy użytkownik odszedł. Pamiętaj, że nagrobki mogą być wynikiem czegoś innego niż działanie zainicjowane przez użytkownika w aplikacji. Na przykład, jako użytkownik, nie chciałbym, aby aplikacja zapominała wszystkie informacje, które wprowadziłem i powróciła do poprzedniego ekranu tylko dlatego, że odebrałem telefon.

Jeśli naprawdę chciałeś to zrobić, to w jaki sposób można to zrobić, zależy od struktury aplikacji i hierarchii nawigacji.

Najlepszym rozwiązaniem będzie prawdopodobnie zbudowanie własnego systemu nawigacji.
Jeśli chcesz użyć wbudowanego tylnego stosu. Twoje zdarzenie Application_Activated może ustawić flagę globalną, że wszystkie strony będą zbierać się w zdarzeniu OnNavigatedTo, a następnie odpowiadać, przechodząc do tyłu. Ta nawigacja wsteczna byłaby prawdopodobnie widoczna (choć krótko) dla użytkownika i spowodowałaby mniej niż pożądane doświadczenie.

Aktualizacja
Jest to teraz możliwe, aby coś jak to zrobić za pomocą Non-Linear Navigation Service.

2

I sekund Matt, to nie jest zalecane zachowanie według wytycznych MSFT. Użytkownik WP7 będzie oczekiwał, że aplikacja zostanie odpowiednio ukropiona.

A jeśli nadal jesteś surowy w tej kwestii, to postępuj tak: używaj funkcji NavigationService.GoBack() tyle razy, ile się poruszałeś. Technicznie WP7 przechowuje całą zmianę strony, którą już zrobiłeś w systemie i możesz zaprogramować powrót do strony głównej. Być może będziesz musiał poczekać na wydarzenie NavigationCompleted, a następnie zadzwonić do następnego GoBacka() i wywołać je do momentu, gdy NavigationService.CanGoBack będzie miał wartość false, która będzie twoją stroną domową :)

0

Jak powiedział @Matt Lacey, to prawie na pewno coś nie należy robić, a prawdopodobnie będzie godziłoby rynku certification guidelines także:

5.2.3 Zastosowanie Reagowanie Po dezaktywowana

aplikacji Windows Phone jest wyłączony, gdy użytkownik naciśnie Przycisk Start lub jeśli limit czasu urządzenia powoduje zablokowanie ekranu blokady. Aplikacja Windows Phone jest również dezaktywowana po wywołaniu Launchera lub funkcji Chooser API. Po uruchomieniu czas uruchomienia aplikacji musi być zgodny z wymaganiami w Rozdziale 5.2.1.

Microsoft zaleca stosowanie przywraca stan wniosku, że użytkownik doświadczył przed złożeniem wniosku wyłączona obsługa. Aby uzyskać więcej informacji, , zobacz temat Omówienie modelu wykonania dla telefonu Windows Phone w temacie .

Jaki rodzaj aplikacji robisz? Trudno jest sprawdzić, czy powrót do ekranu startowego jest odpowiedni, nie wiedząc o tym więcej, ani o kontekście programu.

+0

Dla porównania, wiele aplikacji (w szczególności gier) jest dostępnych na rynku, które nie przywracają stanu po dezaktywacji. To jest zalecenie, a nie zasada. Ale tak, jako użytkownik bardzo frustruje, gdy aplikacja nie zapisuje stanu. –

0

Natrafiliśmy na ten sam problem, konwertując duży projekt i potrzebowaliśmy trochę swobody z tomstoningiem. Wszyscy jesteśmy względnie nowi na tej platformie, więc skorzystaj z tej rady z przymrużeniem oka. Nasza strona startowa to SplashPage.xaml. Użyliśmy UriMapper przekierować z ostatniego źródła prądu:

private void Application_Activated(object sender, ActivatedEventArgs e) { 
     IsTombstoned = ! e.IsApplicationInstancePreserved; 

     if (IsTombstoned) { 
      //the os wants to return to the last page, but we want it to restart to our splash page 
      RootFrame.UriMapper = new RestartUriMapper(); 
     } 
    } 

ten przekierowuje do SplashPage.xaml a następnie robimy inną nawigację, aby usunąć tę ostatnią stronę, że OS chce iść do (może być unikalny dla naszych realizacja nawigacji.)

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

     if (NavigationContext.QueryString.ContainsKey("restart")) { 
      var app = Application.Current as App; 
      //a page redirect mapper was installed to get here from tombstone - reinstate the AssociationUriMapper now 
      app.RootFrame.UriMapper = App.Root.AssociationUriMapper; 

      //from tombstone, the last current nav source is still state, so force an initial navigation back to 
      //a new instance of this splash page and proceed start up from there 
      App.PageNavigation.Navigate(@"/Pages/SplashPage.xaml?fromtomb=true"); 
     } 
    } 


class RestartUriMapper : UriMapperBase { 
    Uri restartUri; 

    public RestartUriMapper() { 
     restartUri = new Uri(string.Format("/Pages/SplashPage.xaml?restart={0}", true.ToString()), UriKind.Relative); 
    } 

    public override Uri MapUri(Uri uri) { 
     if (restartUri != null) { 
      Uri nextPageUri = restartUri; 
      restartUri = null; 
      return nextPageUri; 
     } 

     return uri; 
    } 
} 
2

nie słuchaj tych wszystkich, którzy cytat zrobić gooders Guidlines ziewnięcie

spróbować tej

private void Application_Activated(object sender, ActivatedEventArgs e) 
{ 
    RootFrame.Navigated += RootFrame_Navigated; 
} 

void RootFrame_Navigated(object sender, NavigationEventArgs e) 
{ 
    RootFrame.Navigated -= RootFrame_Navigated; 
    RootFrame.Navigate(new Uri("/TestPage.xaml", UriKind.Relative)); 
} 
Powiązane problemy