应用程序占线时显示活动指示器

时间:2017-04-01 09:51:59

标签: xamarin xamarin.forms spinner loading

我正在使用Xamarin.Forms开发跨平台移动应用程序。

我尝试使用简单的Activity Indicator和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用户对话,但它不起作用。

我的应用必须兼容Android和iOS。

你能帮帮我吗? 感谢。

编辑:

是的,我以这种方式将页面绑定到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,活动指示器也不会显示。

1 个答案:

答案 0 :(得分:4)

问题很明显:

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

您正在使用Wait()阻止主线程,而是等待它:

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

然后你应该看到活动指标。