如何使用Xamarin Prism在Android上设置ParentActivityOrWindow
我正在重写我的香草Xamarin应用程序以使用Prism库 当前应用程序使用Azure ADB2C进行授权 Android需要设置其父窗口,这是通过将以下代码添加到Android项目的MainActivity.cs中实现的:如何使用Xamarin Prism在Android上设置ParentActivityOrWindow,android,xamarin,prism,azure-ad-b2c,Android,Xamarin,Prism,Azure Ad B2c,我正在重写我的香草Xamarin应用程序以使用Prism库 当前应用程序使用Azure ADB2C进行授权 Android需要设置其父窗口,这是通过将以下代码添加到Android项目的MainActivity.cs中实现的: var authenticationService = DependencyService.Get<IAuthenticationService>(); authenticationService.SetParent(this); var authentica
var authenticationService = DependencyService.Get<IAuthenticationService>();
authenticationService.SetParent(this);
var authenticationService=DependencyService.Get();
authenticationService.SetParent(此);
这不适用于Prism应用程序,authenticationService为空。作为记录,这里使用的DependencyService是Xamarin.Forms.DependencyService
我还尝试了来自的示例,并将此代码放入AndroidInitializer:
public void RegisterTypes(IContainerRegistry container)
{
// Register any platform specific implementations
container.RegisterSingleton<IAuthenticationService, B2CAuthenticationService>("B2CAuthenticationService");
var authService = Container.Resolve<IAuthenticationService>();
authService.SetParent(this);
}
公共无效注册表类型(IContainerRegistry容器)
{
//注册任何特定于平台的实现
集装箱登记单(“B2CAuthenticationService”);
var authService=Container.Resolve();
authService.SetParent(此);
}
在这段代码中,容器(DryIoC容器)没有解析的定义
为完整起见,这是我的App.cs注册表类型:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton<IAuthenticationService, B2CAuthenticationService>();
...
...
}
受保护的覆盖无效注册表类型(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterSingleton();
...
...
}
这里有一些错误的假设。首先,您会注意到IContainerRegistry中特别包含名称Registry,这意味着我们不希望您在这里解析类型。这就是为什么在它上面看不到Resolve方法,而是IContainerProvider实例
根据设计,Prism不再直接与Xamarin.Forms DependencyService一起工作,因为这是一个完整的反模式。也就是说,如果您遵循注册平台特定类型的指导,您可以看到如何使用IPlatformInitializer注册平台特定类型。在这里,重要的是要认识到在PrismApplication中调用RegisterTypes之前先调用IPlatformInitializer
我建议引入IParentWindowProvider,如:
public interface IParentWindowProvider
{
object Parent { get; }
}
然后,您可以在Android上实现此功能,如:
public class MainActivity : IPlatformInitializer, IParentWindowProvider
{
object IParentWindowProvider.Parent => this;
void IPlatformInitializer.RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterInstance<IParentWindowProvider>(this);
}
}
public类主活动:IPlatformInitializer、IParentWindowProvider
{
对象IParentWindowProvider.Parent=>this;
void IPlatformInitializer.RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterInstance(此);
}
}
然后在应用程序中,您可以执行以下操作:
protected override void OnInitialized()
{
if(Container.IsRegistered<IParentWindowProvider>())
{
var provider = Container.Resolve<IParentWindowProvider>();
var authService = Container.Resolve<IAuthenticationService>();
authService.SetParent(provider.Parent);
}
}
protected override void OnInitialized()
{
if(Container.IsRegistered())
{
var provider=Container.Resolve();
var authService=Container.Resolve();
authService.SetParent(provider.Parent);
}
}
有关更多信息,请务必查看相关文档和样本