如何在Xamarin.Android和Xamarin.iOS中将Xamarin表单内容添加为子视图

如何在Xamarin.Android和Xamarin.iOS中将Xamarin表单内容添加为子视图,xamarin.ios,xamarin.android,xamarin.forms,Xamarin.ios,Xamarin.android,Xamarin.forms,我们有一个“遗留”的Xamarin.Android和Xamarin.iOS项目。我们希望将Xamarin表单组件作为子视图注入“原生”Android和iOS视图。该组件仅作为Xamarin Forms组件提供,将整个应用程序重写为Xamarin.Forms成本太高 主要问题是我们如何在“原生”Xamarin.Android或Xamarin.iOS视图中将复杂的Xamarin.Forms布局添加为子视图 我们已经做了一些概念验证工作,并成功地将XF第三方组件作为单个Xamarin表单元素注入。然而

我们有一个“遗留”的Xamarin.Android和Xamarin.iOS项目。我们希望将Xamarin表单组件作为子视图注入“原生”Android和iOS视图。该组件仅作为Xamarin Forms组件提供,将整个应用程序重写为Xamarin.Forms成本太高

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

我们已经做了一些概念验证工作,并成功地将XF第三方组件作为单个Xamarin表单元素注入。然而,当我们将带有子元素的布局作为StackLayout注入时,这种技术并不完全有效

中心代码段位于
MainActivity.cs
ViewController.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);

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

预期结果将是显示整个StackLayout及其子级。但是,没有一个孩子是可见的

我们认为这与Xamarin.Forms如何计算StackLayout中VisualElement的大小有关,但我们尚未成功触发 这个计算

我们还注意到,当WidthRequest和HeigthRequest被添加到StackLayout的子级时,iOS渲染器成功地计算大小,但当仅设置了HorizontalOptions和VerticalOptions时,则无法计算大小

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

    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.
    }