我们有一个“遗留”的Xamarin.Android和Xamarin.iOS项目 . 我们想将一个Xamarin Forms组件作为子视图注入“原生”Android和iOS视图 . 该组件仅作为Xamarin Forms组件提供,并且将整个应用程序重写为Xamarin.Forms过于昂贵 .

主要问题是我们如何在“本机”Xamarin.Android或Xamarin.iOS视图中添加复杂的Xamarin.Forms布局作为子视图?

我们已经做了一些概念验证工作,并已成功将XF第三方组件注入单个Xamarin Forms元素 . 但是,当我们使用子元素注入布局时,例如StackLayout,这种技术并不完全有用 .

代码的核心部分是 MainActivity.csViewController.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.
    }

在这里,我们创建一个渲染器并手动将“本机视图/视图组”添加到视图控制器中存在的iOS根视图或活动加载的Android布局中 .

预期的结果是整个StackLayout与其子项一起显示 . 但是,没有一个孩子是可见的 .

我们认为这与Xamarin.Forms如何计算StackLayout中VisualElements的大小有关,但我们没有成功触发此计算 .

我们还注意到,当将WidthRequest和HeigthRequest添加到StackLayout的子节点时,iOS渲染器成功计算大小,但是当仅设置HorizontalOptions和VerticalOptions时则不成功 .

主要问题是我们如何在“原生”Xamarin.Android或Xamarin.iOS视图中添加复杂布局作为子视图?