在Xamarin C#中设置UI元素,然后调用异步函数

时间:2017-04-19 16:55:55

标签: c# visual-studio xamarin xamarin.android

任何人都可以在我的Xamarin项目中帮助我使用此代码。当点击“登录”按钮时,我试图设置一个加载轮(表示一个动作正在发生并让用户知道等待)。出于某种原因,由于该函数是异步的,因此在运行API代码时,加载轮永远不会设置为可见。我点击登录时无法显示,但仍然可以登录功能。

    // Defined up above in the file
    var loginButton = new Button
    {
        Text = "Login",
    };
    loginButton.BackgroundColor = Color.Navy;
    loginButton.TextColor = Color.White;
    loginButton.Clicked += OnLoginButtonClicked;

    async void OnLoginButtonClicked(object sender, EventArgs e)
    {
        loadingWheel.IsVisible = true;

        try
        {
            var restUrl = "*******";
            var content = string.Empty;
            using (var client = new HttpClient())
            {

                string body = "{\"UserName\":\"" + usernameEntry.Text + "\", \"Password\":\"" + passwordEntry.Text + "\"}";

                var contentType = new StringContent(body, Encoding.UTF8, "application/json");

                var result = client.PostAsync(restUrl, contentType).Result;
                content = await result.Content.ReadAsStringAsync();
            }

            if (content.ToLower() != "false")
            {
                var menuPage = new MenuPage();
                NavigationPage = new NavigationPage(new HomePage());
                RootPage = new Views.MainPage();
                RootPage.Master = menuPage;
                RootPage.Detail = NavigationPage;
                MainPage = RootPage;

            }
            else
            {
                messageLabel.Text = "Username or password incorrect. Please try again.";
                passwordEntry.Text = string.Empty;
            }

        }
        catch (Exception ex)
        {
            messageLabel.Text = "Please check the internet connection for the connectivity.";
        }
    }

如果我注释掉整个try块,那么装载轮就会显示出来。它只是不适用于那里的代码。

有人可以帮我解决这个问题吗?感谢。

1 个答案:

答案 0 :(得分:1)

我认为你可以试试BeginInvokeOnMainThread

Device.BeginInvokeOnMainThread (() => {
  loadingWheel.IsVisible = true;
});

更新

我也创建了这个REPO ......它没有BeginInvodeOnMainThread

public class MyPage6 : ContentPage
{

    ActivityIndicator _ac = new ActivityIndicator { IsVisible = false, IsRunning = false };

    public MyPage6()
    {
        Button b = new Button {Text = "Press for ActivityIndicator" };
        b.Clicked += B_Clicked;

        Content = new StackLayout
        {
            Children = {
                _ac,
                b,
                new Label { Text = "Hello ContentPage" }
            }
        };
    }

    async void B_Clicked(object sender, EventArgs e)
    {

        _ac.IsRunning = true;
        _ac.IsVisible = true;
        await Task.Delay(2000);
        _ac.IsRunning = false;
        _ac.IsVisible = false;
    }
}