6

Mam bardzo podobną sytuację do this guys question, ponieważ mam stronę logowania, która jest moim plikiem MainPage.xaml, ale mam kolejną stronę o nazwie SetPassword.xaml, którą chcę załadować jeśli użytkownik jeszcze nie ustawił hasła. Zasadniczo jest to pierwszy ładunek aplikacji po jej zainstalowaniu.Windows Phone 8.1 sprawdź, czy hasło ustawione inaczej załaduj nową stronę

Spędziłem wiele godzin na próbowaniu różnych rozwiązań (w tym tego, z którym się łączyłem), ale po prostu nie dostaję się nigdzie i wydaje się, że wiele rozwiązań jest albo dla WP7 albo WP8 i nic podobnego nie zostało rozwiązany dla nowego WP8.1.

To jest podstawowa kontrola, przy użyciu Windows. Pamięci, które robię, aby sprawdzić, czy hasło zostało ustawione, czy nie.

Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; 
Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; 

if (localSettings.Values["myPassword"] == null) 
{ 
    Debug.WriteLine("Password not set"); 
    this.Frame.Navigate(typeof(SetPassword)); 
} 
else 
{ 
    Debug.WriteLine("Password is set, continuing as normal"); 
} 

Jeśli dodać do tego public MainPage() klasie nie mam problemu w aplikacji powracającego „Hasło nie jest ustawione” w komunikatach debugowania jednak nawigacja this.frame.Navigate(typeof(SetPassword)) nigdy ładuje widok SetPassword.

Próbowałem również tej metody w OnNavigatedTo z dokładnie takie same wyniki.

W moim pliku App.xaml próbowałem również wielu różnych metod, z tymi samymi wynikami. Mogę uzyskać komunikat debugowania, ale nie nawigację, której szukam. Spojrzałem na implementację metody na Application_Launchingover here oraz implementacji nawigacji warunkowej na RootFrame.Navigating+= RootFrameOnNavigating;over here, ale wyraźnie brakuje mi czegoś.

Mam nadzieję, że mądrzejsi ludzie mogą mi pomóc w tym, aby moja nawigacja działała w oparciu o wartość warunkową?

+0

Konstruktor strony początkowej nie jest miejscem do nawiązywania połączeń z nawigacją. Sprawdź to, może to być pomocne. http://blogs.msdn.com/b/ptorr/archive/2010/08/28/redirecting-an-initial-navigation.aspx Co jeszcze wypróbowałeś w odniesieniu do 'RootFrameOnNavigating', które nie działało? Pokaż trochę kodu, lepiej opisz swój problem. Nie publikuj linków do innych pytań. – Pantelis

+0

Jestem poważnie zakłopotany, wymyśliłem to i opublikuję teraz rozwiązanie. – justinhartman

Odpowiedz

5

Rozwiązanie było proste. Aby wykonać nawigację, mogłem to zrobić w aplikacji lub na stronie głównej, jak na moje pytanie, ale powodem, dla którego nawigacja nie działała, było to, że próbowałem nawigować do SetPassword.xaml, który był <ContentDialog> zamiast <Page>.

Czuję się zawstydzony, że nawet tego nie sprawdziłem, ale mam nadzieję, że jeśli zdarzy się komuś innemu, mogą sprawdzić, czy rzeczywiście próbują przejść do strony, a nie do innego elementu. Jak ze mnie głupio!

EDIT:

Oto co mój OnLaunched w pliku App.xaml wygląda gdzie mogę teraz zrobić czek i przekierowanie do innej strony na podstawie wartości są ustawione.

protected override void OnLaunched(LaunchActivatedEventArgs e) 
{ 
    Frame rootFrame = Window.Current.Content as Frame; 

    if (rootFrame == null) 
    { 
     rootFrame = new Frame(); 
     rootFrame.CacheSize = 1; 

     Window.Current.Content = rootFrame; 

     // The following checks to see if the value of the password is set and if it is not it redirects to the save password page - else it loads the main page. 
     Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; 
     Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; 

     if (localSettings.Values["myPassword"] == null) 
     { 
      rootFrame.Navigate(typeof(SetPassword)); 
     } 
     else 
     { 
      rootFrame.Navigate(typeof(MainPage)); 
     } 
    } 

    if (rootFrame.Content == null) 
    { 
     if (rootFrame.ContentTransitions != null) 
     { 
      this.transitions = new TransitionCollection(); 
      foreach (var c in rootFrame.ContentTransitions) 
      { 
       this.transitions.Add(c); 
      } 
     } 

     rootFrame.ContentTransitions = null; 
     rootFrame.Navigated += this.RootFrame_FirstNavigated; 

     if (!rootFrame.Navigate(typeof(MainPage), e.Arguments)) 
     { 
      throw new Exception("Failed to create initial page"); 
     } 
    } 

    Window.Current.Activate(); 
} 
+0

Wystarczy FYI, ta linia w kodzie jest przestarzały, ponieważ nigdy nie faktycznie wykorzystane w dowolny sposób i można go wyjąć: \t 'Windows.Storage.StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;' Zamiast edytując post powyżej pomyślałem, że lepiej byłoby dodać komentarz. – justinhartman

+0

To rozwiązanie działa zgodnie z oczekiwaniami, ale zastanawiam się, czy istnieje czystszy sposób rozwiązania tego problemu przez MVVM.Prawdopodobnie strona pośrednia z viewmodelem zajmującym się warunkową nawigacją. – vivekp