Como adicionar conteúdo do Xamarin Forms como uma subvisão no Xamarin.Android e Xamarin.iOS

Temos um projeto Xamarin.Android e Xamarin.iOS "legado". Gostaríamos de injetar um componente Xamarin Forms como uma subvisão em uma visualização "nativa" do Android e iOS. O componente está disponível apenas como componente do Xamarin Forms e é muito caro reescrever o aplicativo inteiro no Xamarin.Forms.

A principal questão é como podemos adicionar layouts complexos do Xamarin.Forms como uma subvisão em uma exibição "nativa" do Xamarin.Android ou Xamarin.iOS?

Fizemos algumas provas de conceito e injetamos com sucesso um componente de terceiros do XF como um único elemento do Xamarin Forms. No entanto, essa técnica não funciona totalmente quando injetamos um layout com elementos filhos, como, por exemplo, um StackLayout.

As partes centrais do código estão, por exemplo, emMainActivity.cs eViewController.cs

MainActivity.cs:

    protected override void OnCreate (Bundle savedInstanceState)
    {
        base.OnCreate (savedInstanceState);
        Xamarin.Forms.Forms.Init (this, savedInstanceState);
        SetContentView (Resource.Layout.Main);

        _stackedLabels = new StackedLabels ();
        var renderer = Xamarin.Forms.Platform.Android.Platform.CreateRenderer (_stackedLabels.LabelStack);  // LabelStack is a StackLayout

        var rootLayout = this.FindViewById<LinearLayout> (Resource.Id.root);
        rootLayout.AddView (renderer.ViewGroup);

    }

ViewController.cs:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        _stackedLabels = new StackedLabels ();
        var renderer = Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (_stackedLabels.LabelStack);  // LabelStack is a StackLayout

        var rootLayout = this.View;
        rootLayout.Add (renderer.NativeView);

        renderer.NativeView.Frame = this.View.Bounds;
        renderer.SetElementSize (new Xamarin.Forms.Size (this.View.Bounds.Width, this.View.Bounds.Height)); // Companion method not found for Android since we do not know exact size in the Android activity OnCreate method.
    }

Aqui, criamos um renderizador e adicionamos o "grupo nativo de visualizações / visualizações" manualmente à visualização raiz do iOS presente no controlador de visualização ou no layout do Android carregado pela atividade.

O resultado esperado seria que o StackLayout inteiro seja exibido com seus filhos. No entanto, nenhuma das crianças é visível.

Achamos que isso tem a ver com a forma como o Xamarin.Forms calcula os tamanhos dos Elementos Elétricos no StackLayout, mas não tivemos êxito em acionar esse cálculo.

Também observamos que o renderizador do iOS calcula com êxito os tamanhos quando WidthRequest e HeigthRequest são adicionados aos filhos de StackLayout, mas não quando apenas HorizontalOptions e VerticalOptions são definidas.

A principal questão é como podemos adicionar layouts complexos como uma subvisão em uma exibição "nativa" do Xamarin.Android ou Xamarin.iOS?

questionAnswers(0)

yourAnswerToTheQuestion