2017-04-01 9 views
1

Xamarin.Formsでクロスプラットフォームモバイルアプリを開発しています。アプリがビジー状態のときのアクティビティインジケータの表示

私は、単純なアクティビティインジケータとIボタンでWebサービスにPOSTをシミュレートしようとしています。私はボタン上でそれをしたいと思うアクティビティインジケータが表示され、IsLoadingプロパティがfalseに設定されるまで残る。

ここに私の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> 

そして、彼LoginCommand:

公開イベントPropertyChangedEventHandlerのPropertyChanged;

protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    protected void SetValue<T>(ref T backingField, T value, [CallerMemberName] string propertyName = null) 
    { 
     if (EqualityComparer<T>.Default.Equals(backingField, value)) 
      return; 

     backingField = value; 

     OnPropertyChanged(propertyName); 
    } 

    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); } } 

    private void Login() 
    { 
     IsLoading = true; 
     Show = false; 

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

     IsLoading = false; 
     Show = true; 
    } 

ログインボタンをタップしても何も起こりませんが、5秒後にアプリケーションは別のアプリケーションにナビゲートします。私もACR User Dialogsを試しましたが、うまくいきません。

アプリはAndroidとiOSに対応している必要があります。

私を助けることができますか?おかげさまで

EDIT:

はい、私はこのようにWievModelにページをバインドさ:私は何を意味

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); } } 
} 

は、私がログインボタンをタップするとアクティビティインジケータが私さえあれば表示されないということですIsLoadingをtrueに設定します。

+0

'ログインボタンをタップすると何も起こらず、5秒後にアプリケーションは別のアプリケーションにナビゲートします。 - 詳しく教えてください。ページ/ビューのバインディングコンテキストを設定しましたか? – EvZ

+0

私はいくつかのコードを追加しました。ナビゲーションについて私が意味するのは、このページはログインページです。実際のコードでは、ログイン方法の最後にアクティビティインジケータのみを表示したいので、資格情報のチェック手順についてコメントしました.'Application.Current.MainPage =新しいNavigationPage(新しいHomePage()) 'ボタンをタップすると、アクティビティインジケータが表示されず、5秒後にHomePageに移動します。 –

+0

IsLoading TwoWayのバインドはなぜですか? –

答えて

1

問題は明白です:

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

あなたは、Wait()でメインスレッドをブロックしている代わりにそれを待っています:

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

その後、活動の指標が表示されるはずです。

+0

はい、あなたは正しいです。ありがとうございました –

関連する問題