【问题标题】:Navigating from Platform Specific (UWP) PageRenderer and back to PCL Page从平台特定 (UWP) PageRenderer 导航并返回 PCL 页面
【发布时间】:2017-07-08 09:42:55
【问题描述】:
  • 我在 PCL 中有一个 MainPage,然后导航到特定平台 LoginButton上的登录页面点击事件
  • Lo​​ginPage 继承自 特定于平台的 PageRenderer,因为它需要特定于平台 对社交提供者(Facebook、谷歌、Twitter、 微软等)
  • 我正在使用 Xamarin.Auth 进行身份验证。
  • 在 LoginPage 的 OnElementChanged 事件中,它实例化 OAuth2Authenticator 对象。
  • 成功实例化后(基于 提供程序和应用程序详细信息),它需要调用特定的 UI 供应商。
  • 为此,我调用 auth.GetUI,其中 auth 是 Xamarin.Auth.OAuth2Authenticator 对象。

我有两个问题:

  1. 在 UWP 中,如何导航到提供程序登录 UI?更具体地说,iOS 和 Android 中以下代码 sn-ps 在 UWP 中的等价物是什么?在 iOS 中,使用以下代码: PresentViewController(auth.GetUI(), true, null); 其中 auth 是 Xamarin.Auth.OAuth2Authenticator 对象。 在 Android 中使用以下内容: activity.StartActivity(auth.GetUI(activity));

我正在寻找 UWP 中的等效代码。请记住,这些调用是从从平台特定的 PageRenderer 派生的 LoginPage 进行的

  1. 身份验证成功后,如何导航回我的 MainPage(位于 PCL 中)?

代码基于以下来源的示例: http://www.c-sharpcorner.com/article/oauth-login-authenticating-with-identity-provider-in-xamarin-forms/

这是我的登录页面代码:

using System;
using Valufy;
using Xamarin.Forms.Platform.UWP;
using System.ComponentModel;
using Valufy.UWP;
using Valufy.AuthConfiguration;
using Xamarin.Forms;
[assembly: ExportRenderer(typeof(ProviderLoginPage), typeof(LoginRenderer))]

namespace Valufy.UWP
{
class LoginRenderer: PageRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.Page> e)
{
    base.OnElementChanged(e);

    //Get and Assign ProviderName from ProviderLoginPage
    ProviderLoginPage loginPage = (ProviderLoginPage)Element;
    string providername = loginPage.ProviderName;

        //Create OauthProviderSetting class with Oauth Implementation .Refer Step 6
        OAuthProviderSetting oauth = new OAuthProviderSetting();

            Xamarin.Auth.OAuth2Authenticator auth = oauth.LoginWithProvider(providername);  

            // After facebook,google and all identity provider login completed 
            auth.Completed += Auth_Completed;

            Type page_type = auth.GetUI();
//////THIS IS WHERE I AM STUCK...HOW DO I GO TO THE PROVIDER AUTH UI ////////////

//this.Frame.Navigate(page_type, auth);
//parentPage.Navigation.PushModalAsync(auth.GetUI());

            }

    }

    private void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
    {
        if (e.IsAuthenticated)
        {
            OAuthConfig.User = new UserDetails();
            // Get and Save User Details 
            OAuthConfig.User.Token = e.Account.Properties["oauth_token"];
            OAuthConfig.User.TokenSecret = e.Account.Properties["oauth_token_secret"];
            OAuthConfig.User.TwitterId = e.Account.Properties["user_id"];
        OAuthConfig.User.ScreenName = e.Account.Properties["screen_name"];

/////NOW, HOW GO I GO BACK TO THE CALLING PAGE IN PCL ///////////////////

    }
    else
    {
        // The user cancelled
/////NOW, HOW GO I GO BACK TO THE CALLING PAGE IN PCL ///////////////////
}
}
}
}                

【问题讨论】:

  • 该问题已得到充分讨论,解决方案已发布herehere。感谢您的回复@apineda。虽然你的回答并不完整,但它确实帮助我朝着正确的方向思考。

标签: xamarin.forms xamarin.auth xamarin.uwp


【解决方案1】:

以下是导航到 UWP 提供程序登录的代码: WindowsPage windowsPage = new WindowsPage();

                _frame = windowsPage.Frame;
                if (_frame == null)
                {
                    _frame = new Windows.UI.Xaml.Controls.Frame
                    {
                        Language = global::Windows.Globalization.ApplicationLanguages.Languages[0]
                    };
                    windowsPage.Content = _frame;
                    SetNativeControl(windowsPage);
                }

                Type pageType = auth.GetUI();
                _frame.Navigate(pageType, auth);

要在成功验证后导航回我的页面,代码如下:

private async void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
    {
        if (e.IsAuthenticated)
        {

            var request = new OAuth2Request("GET", new Uri("https://login.microsoftonline.com/common/oauth2/V2.0/token?oauth2_access_token=" + e.Account.Properties["access_token"]), null, e.Account);
            try
            {
                string response = await MSGetUserInfo(e.Account);


            }
            catch (System.OperationCanceledException)
            {
                                }
            catch (Exception ex)
            {
                                }
            this.Element.Navigation.PushModalAsync(new MainPage());


        }
        else
        {
            // The user cancelled
        }
    }

【讨论】:

    【解决方案2】:

    1- 在 UWP 中,如何导航到提供程序登录 UI

    您需要创建一个 UWP Page 对象,您将用于在渲染器中显示的同一对象是您将用于进行导航的对象。

    Type page_type = auth.GetUI();
    
    page = new MyUWPLoginPage();
    
    page.Frame.Navigate(page_type, auth);
    

    2- 身份验证成功后如何导航回我的 MainPage(位于 PCL 中)?

    有很多方法可以做到这一点,最简单的一种是在您的ProviderLoginPage 类中创建一个公共方法,然后从渲染器类调用此方法并传入参数。

    public class ProviderLoginPage: ContentPage
    {
        ......
    
        public void AuthenticationCompleted(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
        {
            // Do your logic
        }
    
    }
    

    在你的渲染器中使用元素:

    private void Auth_Completed(object sender, Xamarin.Auth.AuthenticatorCompletedEventArgs e)
    {
        var xamElement = Element as ProviderLogin;
    
        xamElement?.AuthenticationCompleted(sender, e);
    }
    

    将所有逻辑移至 PCL 类,这样您就不必在每个渲染器上重复它。

    这应该会有所帮助。

    【讨论】:

    • 感谢您的回复@apineda。我的 ProviderLoginPage 是一个 Xamarin.Forms.Page 对象,它不公开 Frame 属性。另外,由于我已经在 ProviderLoginPage 中,所以我不会只使用“this”而不是创建一个新对象。无论如何,我都会遇到同样的问题,即 Frame 属性没有暴露。
    • 你误会了。对于导航,您需要创建一个不涉及 Xamarin 页面的 UWP 页面。您将在 LoginRenderer 类中创建此对象。
    • 我在 UWP 项目中新建了一个 UWP 页面。我按照你的建议实例化了它。这里是:类型 page_type = auth.GetUI(); UWPLoginPage 页面 = 新 UWPLoginPage(); page.Frame.Navigate(page_type, auth);我得到的页面类型是 + page_type {Name = "WebAuthenticatorPage" FullName = "Xamarin.Auth.WebAuthenticatorPage"} System.Type {System.RuntimeType} auth 对象如下: {Xamarin.Auth.OAuth2Authenticator} 但我得到如下异常:“对象引用未设置为对象的实例。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多