如何在Xamarin.Android和Xamarin.iOS中将Xamarin表单内容添加为子视图
我们有一个“遗留”的Xamarin.Android和Xamarin.iOS项目。我们希望将Xamarin表单组件作为子视图注入“原生”Android和iOS视图。该组件仅作为Xamarin Forms组件提供,将整个应用程序重写为Xamarin.Forms成本太高 主要问题是我们如何在“原生”Xamarin.Android或Xamarin.iOS视图中将复杂的Xamarin.Forms布局添加为子视图 我们已经做了一些概念验证工作,并成功地将XF第三方组件作为单个Xamarin表单元素注入。然而,当我们将带有子元素的布局作为StackLayout注入时,这种技术并不完全有效 中心代码段位于如何在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表单元素注入。然而
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.
}