Strona logowania w Winows Phone 7

W tym poście chciałbym napisać jak w prosty sposób stworzyć stronę logowania do naszej aplikacji. Strona logowania powinna wyświetlić się tylko przy pierwszym uruchomieniu aplikacji, lub gdy użytkownik się wyloguje. Jak to zrobić, żeby przy włączaniu aplikacji nie było widać że tak na prawdę zmieniamy stronę już po wczytaniu MainPage, lub innej strony? Postaram się poprowadzić krok po kroku jak coś takiego zrobić.
Stosując się do rad zawartych poniżej, powinniście w prosty sposób takie wyświetlanie sobie zaprogramować. Zacznijmy więc od początku, tworząc nowy projekt i dodając stronę logowania.


Teraz uruchamiając aplikację otworzy się to co ustawione domyślnie czyli MainPage.xaml. Aby to zmienić musimy się zagłębić w plik WMAppManifest.xml. Zmieńmy w linijce z DefaultTask, parametr NavigationPage:

 <Tasks>
    <DefaultTask  Name ="default" NavigationPage="LoginPage.xaml"/>
 </Tasks>

Ważne żeby stroną, która znajduje się w NavigationPage nie była App.xaml ani MainPage.xaml.
Wpisanie nawet nieistniejącej strony zadziała, najbezpieczniej jest chyba jednak wpisać nazwę strony logowania.

Tak zmieniony kod będzie nam zawsze przechodził do strony LoginPage.xaml zamiast do MainPage.xaml. Nie o to nam jednak chodzi, więc aby osiągnąć swój cel musimy jeszcze dodać do zasobu aplikacji UriMappera, który później pozwoli nam przejść do odpowiedniej strony.
*W Uri musi być ta sama strona co podana wcześniej w WMAppManifest.

Mamy już obiekt UriMappera, którym możemy określić jaką stronę chcemy wywołać. Dodajmy więc do App.xaml.cs taką oto Funkcję.

void SetupUriMapper()
{
    var uriMapper = Resources["mapper"] as UriMapper;
    RootFrame.UriMapper = uriMapper;
    if (IsUserLoggedIn)
        uriMapper.UriMappings[0].MappedUri = new Uri("/MainPage.xaml", UriKind.Relative);
    else
        uriMapper.UriMappings[0].MappedUri = new Uri("/LoginPage.xaml", UriKind.Relative);
}

W tym przykładzie sprawdzam czy użytkownik jest zalogowany za pomocą flagi IsUserLoggedIn. Jeśli jest zalogowany uruchamiam MainPage, jeśli nie, uruchamiam stronę LoginPage. Zostało nam tylko dodać wywołanie tej funkcji na końcu konstruktora i aplikacja już działa.

public App()
{
    //....
    SetupUriMapper();
}

Dodatek

Na koniec jeszcze metoda, która usuwa całą historię stron poprzednich, więc jeśli użytkownik się zaloguje i aplikacja przejdzie do MainPage, powinniśmy wyczyścić kolejkę poprzednich stron, tak żeby po wciśnięciu przycisku wstecz wyjść z aplikacji, a nie powrócić do okna logowania. Tak jak mówiłem, można to zrobić za pomocą jednej linijki zapisanej w metodzie OnNavigateTo():

this.Loaded += (sender, args) => NavigationService.RemoveBackEntry();