Xamarin.Forms设置IsVisible在功能完成之前不会触发。

时间:2017-08-09 20:24:22

标签: c# xamarin xamarin.forms

在我的Xamarin.Forms项目中,我有一个登录表单,用于登录用户,然后将其重定向到另一个页面。我想在尝试登录时显示ActivityIndi​​cator,但将IsVisible设置为true在登录功能完成之前实际上并不生效。我的代码如下所示:

void OnLoginButtonClicked(object sender, EventArgs e)
{
    LoadingIndicator.IsVisible = true;
    Login();
}

public void Login()
{
    var user = new User
    {
        Email = usernameEntry.Text,
        Password = passwordEntry.Text
    };

    User validUser = AreCredentialsCorrect(user);
    if (validUser != null)
    {
        Navigation.PushAsync(new ProfilePage());
    }
    else
    {
        messageLabel.Text = "Login failed";
        passwordEntry.Text = string.Empty;
        //It will only show the LoadingIndicator at this point.
    }
}

如果用户是正确的,它永远不会显示LoadingIndicator,因为它在显示之前导航到另一个页面。 如果用户无效,则只有在遇到else子句并显示“登录失败”后才会显示LoadingIndicator。任何人都可以解释为什么会这样,以及我可以做些什么来解决它?

2 个答案:

答案 0 :(得分:1)

尝试使用async / await。在导航时允许UI更新。

async void OnLoginButtonClicked(object sender, EventArgs e)
{
    LoadingIndicator.IsVisible = true;
    await Login();
}

public async Task Login()
{
    var user = new User
    {
        Email = usernameEntry.Text,
        Password = passwordEntry.Text
    };

    User validUser = AreCredentialsCorrect(user);
    if (validUser != null)
    {
        await Navigation.PushAsync(new ProfilePage());
    }
    else
    {
        messageLabel.Text = "Login failed";
        passwordEntry.Text = string.Empty;
        //It will only show the LoadingIndicator at this point.
    }
}

答案 1 :(得分:0)

这里有两种可能的解释,一种是它可以重定向得太快以至于没有时间显示加载指示器,我之前遇到过这个问题。我们有一个非常好的加载符号和动画,但后来我们切换到Aurelia框架,它登录如此之快,它只是没有时间显示它,即使它实际工作。至于代码更改,我会尝试将其添加到登录功能中,至少目前是为了给它一些清晰度,如果它实际上只是快速登录它没有显示或它根本就不显示。她是我的建议。

void OnLoginButtonClicked(object sender, EventArgs e)
{
    LoadingIndicator.IsVisible = true;
    Login(LoadingIndicator.IsVisible);
}

public void Login(Bool IsVisible)<--- might have type wrong not familiar with you custom defines types I would expect it to be a bool though.
IsVisible = true;
{
    var user = new User
    {
        IsVisible = true;
        Email = usernameEntry.Text,
        Password = passwordEntry.Text
    };

    User validUser = AreCredentialsCorrect(user);
    if (validUser != null)
    {
        IsVisible = true;
        Navigation.PushAsync(new ProfilePage());
    }
    else
    {
        IsVisible = true;
        messageLabel.Text = "Login failed";
        passwordEntry.Text = string.Empty;
        //It will only show the LoadingIndicator at this point.
    }
}

如果没有别的,这可能有助于澄清为什么它没有被显示。另外,在大多数浏览器上,请不要忘记使用Web调试器f12,并查找包含指示符的元素。

希望这有帮助!如果不让我知道,我将删除答案(我必须使用答案,因为我不能在50代以下发表评论)干杯!