Xamarin.forms 从平台特定(UWP)页面渲染器导航并返回PCL页面 我有一个PCL主页,然后导航到特定平台 登录按钮上的登录页面单击事件 登录页是从中继承的 特定于平台的页面渲染器,因为它需要特定于平台的页面渲染器 对社交提供商(Facebook、Google、Twitter、, 微软等) 我正在使用Xamarin.Auth进行身份验证 在LoginPage的OnElementChanged事件中,它实例化 OAuth2Authenticator对象 成功实例化后(基于 在提供程序和应用程序详细信息上),它需要调用特定应用程序的UI 提供者 为此,我调用auth所在的auth.GetUI Xamarin.Auth.OAuth2Authenticator对象
我有两个问题:Xamarin.forms 从平台特定(UWP)页面渲染器导航并返回PCL页面 我有一个PCL主页,然后导航到特定平台 登录按钮上的登录页面单击事件 登录页是从中继承的 特定于平台的页面渲染器,因为它需要特定于平台的页面渲染器 对社交提供商(Facebook、Google、Twitter、, 微软等) 我正在使用Xamarin.Auth进行身份验证 在LoginPage的OnElementChanged事件中,它实例化 OAuth2Authenticator对象 成功实例化后(基于 在提供程序和应用程序详细信息上),它需要调用特定应用程序的UI 提供者 为此,我调用auth所在的auth.GetUI Xamarin.Auth.OAuth2Authenticator对象,xamarin.forms,xamarin.auth,xamarin.uwp,Xamarin.forms,Xamarin.auth,Xamarin.uwp,我有两个问题: 在UWP中,如何导航到提供者登录UI?更具体地说,在iOS和Android中,以下代码片段在UWP中的等效性是什么?在iOS中,使用以下代码: PresentViewController(auth.GetUI(),true,null) 其中auth是Xamarin.auth.OAuth2Authenticator对象。 在安卓系统中,使用了以下内容: activity.StartActivity(auth.GetUI(activity)) 我正在寻找UWP中的等效代码。请记住,这
PresentViewController(auth.GetUI(),true,null)代码>
其中auth是Xamarin.auth.OAuth2Authenticator对象。
在安卓系统中,使用了以下内容:
activity.StartActivity(auth.GetUI(activity))代码>
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 ///////////////////
}
}
}
}
使用系统;
使用Valufy;
使用Xamarin.Forms.Platform.UWP;
使用系统组件模型;
使用Valufy.UWP;
使用Valufy.AuthConfiguration;
使用Xamarin.Forms;
[程序集:ExportRenderer(typeof(ProviderLoginPage)、typeof(LoginRenderer))]
命名空间Valufy.UWP
{
类LoginRenderer:PageRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
//从ProviderLoginPage获取并分配ProviderName
ProviderLoginPage loginPage=(ProviderLoginPage)元素;
字符串providername=loginPage.providername;
//使用Oauth实现创建OauthProviderSetting类。请参阅步骤6
OAuthProviderSetting oauth=新的OAuthProviderSetting();
Xamarin.Auth.OAuth2Authenticator Auth=oauth.LoginWithProvider(providername);
//facebook、google和所有身份提供商登录完成后
验证已完成+=验证已完成;
键入page_Type=auth.GetUI();
//////这就是我被卡住的地方…我如何进入提供者身份验证UI////////////
//此.Frame.Navigate(页面类型,auth);
//parentPage.Navigation.PushModalAsync(auth.GetUI());
}
}
私有无效身份验证已完成(对象发送方,Xamarin.Auth.AuthenticatorCompletedEventArgs e)
{
如果(如未经认证)
{
OAuthConfig.User=newuserdetails();
//获取并保存用户详细信息
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”];
/////现在,我如何回到PCL中的呼叫页面///////////////////
}
其他的
{
//用户取消了
/////现在,我如何回到PCL中的呼叫页面///////////////////
}
}
}
}
1-在UWP中,如何导航到提供商登录UI
您需要创建一个UWP页面对象,用于在渲染器中显示的同一对象就是用于导航的对象
Type page_type = auth.GetUI();
page = new MyUWPLoginPage();
page.Frame.Navigate(page_type, auth);
2-在成功进行身份验证后,我如何导航回我的主页(在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类,这样就不必在每个渲染器上重复它
这应该会有所帮助。以下是导航到UWP提供商登录的代码: WindowsPage WindowsPage=新建WindowsPage() 要在成功验证后导航回我的页面,请执行以下代码:
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
}
}
感谢您的回复@apineda。我的ProviderLoginPage是一个Xamarin.Forms.Page对象,它不公开Frame属性。此外,由于我已经在ProviderLoginPage中,我是否会使用“this”而不是创建一个新对象。在任何情况下,我都会遇到同样的问题,即Frame属性没有公开。您误解了。对于导航,您需要创建一个UWP页面,而不是Xamarin页面。您将在
LoginRenderer
类中创建此对象。我在UWP项目中创建了一个新的UWP页面。我按照你的建议实例化了它。这里是:Type page_Type=auth.GetUI();UWPLoginPage=新的UWPLoginPage();页面.框架.导航(页面类型,身份验证);我得到的页面类型是+page_type{Name=“WebAuthenticatorPage”FullName=“Xamarin.Auth.WebAuthenticatorPage”}System.type{System.RuntimeType}Auth对象如下:{Xamarin.Auth.OAuth2Authenticator}但我得到如下异常:“对象引用未设置为对象的实例。”这个问题得到了很好的讨论,解决方案发布并发布。感谢您的回复@apineda。虽然你的答案不完整,但它确实帮助我朝着正确的方向思考。
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
}
}