我们有一个“遗留”的Xamarin.Android和Xamarin.iOS项目 . 我们想将一个Xamarin Forms组件作为子视图注入“原生”Android和iOS视图 . 该组件仅作为Xamarin Forms组件提供,并且将整个应用程序重写为Xamarin.Forms过于昂贵 .
主要问题是我们如何在“本机”Xamarin.Android或Xamarin.iOS视图中添加复杂的Xamarin.Forms布局作为子视图?
我们已经做了一些概念验证工作,并已成功将XF第三方组件注入单个Xamarin Forms元素 . 但是,当我们使用子元素注入布局时,例如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);
}
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视图中添加复杂布局作为子视图?