如何在Xamarin表单中的静态方法中popmod一个页面?

时间:2017-04-24 14:09:10

标签: c# ios xamarin xamarin.forms

我目前正在登录我的应用程序,现在我在iOS部分。

我创建了一个如下所示的自定义渲染器:

[assembly: ExportRenderer(typeof(TwitterLogin), typeof(TwitterLogin_iOS))]

在iOS渲染器中完成我的身份验证后:

auth.Completed += (object sender, AuthenticatorCompletedEventArgs ee) => 
{
    TwitterLogin.SuccessfulLoginAction.Invoke();
}

我已经在我的TwitterLogin页面上创建了一个在我的共享代码中看起来像这样的函数,该代码在登录完成时运行:

public static Action SuccessfulLoginAction
    {
        get
        {
            return new Action(async () =>
            {
                System.Diagnostics.Debug.WriteLine("login is complete!");
            });
        }
    }

用户登录后我想要发生的是popmodalasync的页面,(之前是pushmodalasync'd到其当前页面,TwitterLogin页面)我想要做的是添加内部的方法SuccessfulLoginAction动作:

await Navigation.PopModalAsync ();

但由于SuccessfulLoginAction是一种静态方法,我无法到达Navigation

如果我这样做:

 auth.Completed += (object sender, AuthenticatorCompletedEventArgs ee) => 
{
    TwitterLogin.SuccessfulLoginAction.Invoke();
    TwitterLogin log = new TwitterLogin();
    log.popPage();
}

并在twitterlogin页面上显示如下函数:

public async void popPage ()
    {
        await Navigation.PopModalAsync();
    }

我得到了崩溃Index was out of range. Must be a non-negative and less than size of the collection让我感到奇怪,因为我从另一个页面开始使用此代码:await Navigation.PushModalAsync(new TwitterLogin());

我也试过了MessagingCenter,但由于我不能在静态方法中使用this,我不能100%确定如何使其工作,当我使用“null”时我明显崩溃:

return new Action(async () =>
{
MessagingCenter.Send<TwitterLogin>(null, "popPage");
}

public TwitterLogin()
{
    MessagingCenter.Subscribe<TwitterLogin>(null, "popPage", async (sender) => {
        await Navigation.PopModalAsync();
    });
}

有关如何调整代码/替代方法的任何想法,以便我可以popmodmodal当前页面?

1 个答案:

答案 0 :(得分:0)

使用此代码完成解决问题:

TwitterLogin log = new TwitterLogin();

auth.Completed += (object sender, AuthenticatorCompletedEventArgs ee) => 
{
   log.OnButtonClicked();
}

在页面上:

public event EventHandler ButtonClicked;

public async void OnButtonClicked()
{
    await Application.Current.MainPage.Navigation.PopAsync();
}