Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Xamarin Prism在Android上设置ParentActivityOrWindow_Android_Xamarin_Prism_Azure Ad B2c - Fatal编程技术网

如何使用Xamarin Prism在Android上设置ParentActivityOrWindow

如何使用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

我正在重写我的香草Xamarin应用程序以使用Prism库

当前应用程序使用Azure ADB2C进行授权

Android需要设置其父窗口,这是通过将以下代码添加到Android项目的MainActivity.cs中实现的:

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);
}
}
有关更多信息,请务必查看相关文档和样本


谢谢你,丹。OnInitialized中使用的容器没有IsRegistered的定义。是否还有其他用途?@DaveSav您可以调用Container.GetContainer().IsRegistered()是的,可以使用,但Container.GetContainer().IsRegistered()为false