2014-10-22 17 views
6

Sto provando a creare un'app con una pagina di accesso come prima pagina.Xamarin Forms Navigazione e gestione di una pagina di login

Una volta che l'utente esegue l'accesso, le pagine successive verranno inserite in un'organizzazione di stack di pagine standard in modo da poter utilizzare facilmente la build nell'oggetto Navigation e avvolgere tutto nelle pagine di navigazione.

ad es.

Login Page -> MainAppPage |-> Category1Page -> Cat1SubPage 
          |-> Category2Page -> Cat2SubPage 

mia comprensione è che avrei dovuto avvolgere MainAppPage con new NavigationPage(), e poi mi hanno accesso all'oggetto di navigazione che mi permette di fare cose come questa:

await this.Navigation.PushAsync(new Category1Page()); 

E le varie piattaforme daranno supporto automatico per il pulsante di ritorno per tornare alla pagina precedente.

Ma non voglio che un utente navighi da LoginPage -> MainAppPage in questo modo, perché non voglio che il backbutton ritorni a Login, senza che vengano esplicitamente attivati ​​il ​​pulsante di logout.

Quindi, come devo gestire la prima transizione di pagina da LoginPage -> Pagina MainApp.

Esiste un modo alternativo per disporre di 2 pagine Primary e scambiare tra esse? O c'è un modo per intercettare le richieste del pulsante Indietro su MainAppPage e scartarle?

Non trovando un sacco di informazioni nella documentazione riguardo a questo, ma sembra come un requisito abbastanza standard in modo possibilmente PEBKAC

risposta

3

Mi vengono in mente almeno due soluzioni.

Un modo è creare prima una pagina di accesso principale e all'interno di quella pagina mostrare la pagina di accesso come Modale.

Altro sarebbe creare una pagina specifica della piattaforma, caricare la Pagina di accesso e solo dopo il login riuscito navigare in MainPage utilizzando la navigazione specifica della piattaforma (LoginPage dovrebbe essere NoHistory o qualcosa del genere per evitare di tornare indietro) non Forms navigation (cioè in Android entrambe le pagine dovrebbero essere attività separate). Ciò richiede un po 'più di lavoro dal momento che devi gestire le tre piattaforme, ma non dovrebbe essere troppo oneroso.

Detto questo, c'è una navigazione migliore presumibilmente in arrivo, si spera, 1.3.0.

+0

Grazie Miha, Cercherò in entrambe le soluzioni. apprezzalo. –

0

Questo è quello che ho a lavorare su Android:

protected override void OnCreate (Bundle bundle){ 
    base.OnCreate (bundle); 

    string start = "new"; 
    Bundle extras = Intent.Extras; 
    if (extras != null) { 
     start = extras.GetString ("start"); 
    } 

    if(start == "new"){ 
     SetPage (App.GetLoginPage (OnLoginCompleted)); 
    } else if (start == "login") { 
     SetPage (App.GetMainPage (OnSignOutCompleted)); 
    } 
} 

void OnLoginCompleted(){ 
    // ... 
    var refresh = new Intent (this, typeof(MainActivity)); 
    refresh.PutExtra ("start", "login"); 
    StartActivity (refresh); 
    Finish(); 
} 
void OnSignOutCompleted(){/* mirrors OnLoginCompleted */ } 

Questa è effettivamente un'attività con una pagina di destinazione configurabile. Per cambiarlo, ripartiamo con un'impostazione diversa. È un po 'più lento di navigare sul mio telefono ma solo apprezzabile.

0

Come ha detto Miha Markic, una finestra Modale è una buona opzione. Un'altra cosa che puoi anche considerare, specialmente se vuoi che la pagina di login abbia la stessa barra di navigazione delle tue altre pagine, sarebbe la stessa cosa che ho già postato nell'URL della domanda qui sotto.

In sostanza, si dovrebbe tenere un riferimento alla tua NavigationPage nella classe App (consente di chiamare AppNavPage), poi, quando mostra la pagina di accesso, si mette la pagina di login all'interno di un separato NavigationPage e fare un PushAsync() con il nuovo NavigationPage e la pagina di accesso.

Una volta che l'utente accede con successo, basta sostituire l'attuale MainPage con il tuo vecchio NavigationPage utilizzando questo codice: Application.Current.MainPage = App.AppNavPage

Partenza sul link qui sotto per esempi di codice migliori.

https://stackoverflow.com/a/32382852/3850012

5

Ho appena pubblicato un campione rapido su Github per questo scenario. L'idea è di voler inizialmente navigare verso la tua NavigationPage, quindi se necessario (il che significa che l'utente non ha già effettuato l'accesso), spingere la LoginPage in modo modale. Quindi, in caso di accesso riuscito, inserire semplicemente la pagina di accesso dalla pila. È possibile controllare il campione qui, https://github.com/jamesqquick/Xamarin-Forms-Login-Navigation/blob/master/ReadMe.MD

Screenshot from HomePage

+0

Ma assicurati di impostare 'NavigationPage.HasBackButton =" False "' sulla tua pagina di accesso, perché alcune piattaforme avranno ancora un pulsante Indietro che consente all'utente di navigare lontano dal modal di accesso. – DdW

+0

Il link corretto per questo esempio è https://github.com/jamesqquick/Xamarin-Forms-Login-Navigation/ –

0

penso che il modo migliore sarebbe quella di rimuovere il LoginPage dalla pila una volta che si verifica di accesso, allora non è disponibile più.

async void OnLoginButtonClicked (object sender, EventArgs e) 
{ 
    ... 
    var isValid = AreCredentialsCorrect (user); 
    if (isValid) { 
    App.IsUserLoggedIn = true; 
    Navigation.InsertPageBefore (new MainPage(), this); 
    await Navigation.PopAsync(); 
    } else { 
    // Login failed 
    } 
} 

A condizione che le credenziali dell'utente sono corretti, il MainPage istanza viene inserito nella pila di navigazione prima che la corrente pagina. Il metodo PopAsync rimuove quindi la pagina corrente dallo stack di navigazione , con l'istanza MainPage che diventa la pagina attiva.

Leggi la descrizione generale here

Problemi correlati