2017-04-01 1 views
1

Je développe une application mobile Cross Platform avec Xamarin.Forms. J'essaye de simuler un POST sur le service Web avec un simple indicateur d'activité et un bouton I. Je veux que sur le bouton, cliquez sur l'indicateur d'activité s'affiche et reste jusqu'à ce que la propriété IsLoading est définie sur false.Afficher l'indicateur d'activité lorsque l'application est occupée

Voici mon XAML:

<AbsoluteLayout x:Name="layOuter"> 
    <ActivityIndicator x:Name="actWebRequest" 
     IsVisible="{ Binding IsLoading, 
          Mode=TwoWay }" 
     IsRunning="{ Binding IsLoading, 
          Mode=TwoWay }" 
     AbsoluteLayout.LayoutBounds="0.5, 0.5, 100, 100" 
     AbsoluteLayout.LayoutFlags="PositionProportional" /> 


    <Button x:Name="btnLogin" 
        IsVisible="{ Binding Show, 
          Mode=TwoWay }" 
        Text="{ StaticResource LoginButtonText }" 
        Command="{ Binding LoginCommand }" 
        BackgroundColor="Teal" /> 
</AbsoluteLayout> 

Et il le LoginCommand:

événement public PropertyChangedEventHandler PropertyChanged; En appuyant sur le bouton de connexion, rien ne se passe et, au bout de 5 secondes, l'application accède à l'autre. J'ai également essayé les dialogues d'utilisateur d'ACR mais cela ne fonctionne pas.

Mon application doit être compatible avec Android et iOS.

Pouvez-vous m'aider? Merci.

EDIT:

Oui, je binded la page WievModel ainsi:

public class ContentBase<T> : ContentPage where T : class, new() 
{ 
    public T ViewModel 
    { 
     get { return BindingContext as T; } 
     set { BindingContext = value; } 
    } 

    public ContentBase() { ViewModel = new T(); } 
} 

public class LoginPageBase : ContentBase<LoginViewModel> { } 

public partial class LoginPage : LoginPageBase 
{ 
    public LoginPage() 
    { 
     InitializeComponent(); 
    } 

    protected override bool OnBackButtonPressed() 
    { 
     return true; 
    } 
} 

public class LoginViewModel : ViewModelBase 
{ 
    private bool _isLoading; 
    private bool _show; 
    public bool IsLoading { get { return _isLoading; } set { SetValue(ref _isLoading, value); } } 
    public bool Show { get { return _show; } set { SetValue(ref _show, value); } } 
} 

Ce que je veux dire est que lorsque je tape sur le bouton Connexion l'indicateur d'activité ne montre pas même si je Définissez IsLoading sur true.

+0

'En appuyant sur le bouton de connexion, rien ne se passe, et après 5 secondes l'application navigue vers un autre.' - S'il vous plaît élaborer. Avez-vous défini le contexte de liaison de la page/vue? – EvZ

+0

J'ai ajouté un autre code. A propos de la navigation ce que je veux dire, c'est que cette page est la page de connexion donc dans mon code réel, pour le moment j'ai commenté la procédure de vérification des informations d'identification parce que je veux seulement voir l'indicateur d'activité, à la fin de la méthode Login. new NavigationPage (new HomePage()) 'donc je tape sur le bouton, l'indicateur d'activité ne s'affiche pas et après 5 secondes, il navigue vers HomePage. –

+0

Pourquoi votre liaison pour IsWatch TwoWay? –

Répondre

1

Le problème est évident:

System.Threading.Tasks.Task.Delay(5000).Wait(); 

Vous bloquez le fil conducteur avec Wait(), à la place l'attendent:

await System.Threading.Tasks.Task.Delay(5000); 

alors vous devriez voir l'indicateur d'activité.

+0

Oui, vous avez raison. Je vous remercie –