2016-10-24 6 views
0

Я строю приложение Xamarin.Forms PCL.Навигация Xamarin не меняется при первом запуске

У меня есть некоторые Войти логику Hande .. Войти ..

В принципе: если authtoken присутствует, он будет вызывать DoLogin() напрямую и перенаправлять на моей странице MasterDetail.

Код:

// tries to get remote token and calls DoLogin(Token) 
    private async void AttemptLogin(string username, string password) 
    { 
     Debug.WriteLine("AttemptLogin"); 
     var service = new WebService(); 
     var loginTask = service.AuthorizeCredentials(username, password); 
     var token = await loginTask; 
     if (token.Length > 0) 
     { 
     DoLogin(token); 
     } 
    } 


    // Tries to get local token and calls DoLogin(Token) 
    private void TryGetLocalAuthtoken() 
    { 
     if (Application.Current.Properties.ContainsKey("authToken")) 
     { 
     var authToken = Application.Current.Properties["authToken"].ToString(); 
     DoLogin(authToken); 
     } 
    } 

    private void DoLogin(string token = null) 
    { 
    Application.Current.Properties["authToken"] = token; //todo add timestamp 
    Debug.WriteLine("DoLogin - Token: {0}", token); 
    Application.Current.MainPage = new CustomerMdPage();  
    } 

Весь этот код запускаемый, его начинается моя страница MasterDetail и извлекает данные (из метода в конструкторе)

Но страница не перенаправляются на страницу MasterDetail, он остается на странице входа.

Затем я могу ввести учетные данные и логин, который перенаправит меня на мой MasterDetail.

Вопрос:

Почему я не перенаправлены на мой MasterDetail в первый раз код запуска?

Я с радостью отправлю код или уточню, если этого недостаточно.

Edit: код MasterDetail запрашивали

public CustomerMdPage() 
{ 
    _service = new WebService(); 
    _locator = CrossGeolocator.Current; 
    _locator.DesiredAccuracy = 50; 
    _dataAccess = new DataAccess(); 
    var listview = new ListView { ItemTemplate = new DataTemplate(typeof(CustomerViewCell)) }; 

    listview.ItemSelected += (s, e) => 
    { 
    if (e.SelectedItem != null) 
    { 
     Detail.BindingContext = e.SelectedItem; 
     IsPresented = false; 
     listview.SelectedItem = null; 
    } 
    }; 

    Master = new ContentPage() 
    { 
    Padding = new Thickness(20, Device.OnPlatform(40, 20, 0), 10, 20), 
    Title = "Customers", 
    Content = listview 
    }; 

    GetCustomers(listview); 

    Detail = new CustomerDetailPage(); 
} 
+0

ли вы уверены, что это поражает DoLogin? Вы пытались установить точку останова? Если да, можете ли вы опубликовать код CustomerMdPage –

+0

Я очень уверен, это единственная причина, по которой этот вопрос существует. Я не вижу, как мой код MasterDetail имеет значение, но обязательно –

+0

Хм, при первом ударе точки останова Current.MainPage имеет значение NULL, во второй раз это = LoginView, может ли быть причиной этого maby? –

ответ

0

Вы можете сделать это:

Внутри вашего App.cs вы можете выбрать MainPage вашего приложения, например:

private bool TryGetLocalAuthtoken() 
{ 
    //maybe you can retrieve this with a setting or from the local database. 
    return Application.Current.Properties.ContainsKey("authToken")); 
} 


NavigationPage navigationPage = null; 
if (TryGetLocalAuthtoken()) 
{ 
    navigationPage = new NavigationPage(new LoginPage()); 
} 
else 
{ 
    navigationPage = new NavigationPage(new MainPage(StaticData.Zero)); 
} 
AppNavigation = navigationPage.Navigation; 
MainPage = navigationPage; 
+0

. Это даст мне страницу навигации со стрелкой назад на страницу входа? это то, чего я пытался избежать. Выход из приложения очень редок в этом приложении, и большинство других приложений я предполагаю .. –

+0

Вы можете избавиться от NavigationPage и сделать это: 'MainPage = new MasterDetailPage();' –

+0

Вот пример использования MasterDetailPage Xamarin.Forms https://github.com/15mgm15/XamarinForms-MasterDetailPage-Recipe –

Смежные вопросы