我有一个Xamarin表单ContentView
,其UI在XAML中定义。
使用特定的自定义渲染器时,应将此视图动态添加到应用的根视图。
对于iOS来说,它运行良好,但是在Android上,我无法获得XAML中定义的正确UI。只是得到一个大矩形而已。
iOS中使用的代码
public static UIView ConvertFormsToNative(Xamarin.Forms.View view, CGRect size)
{
var renderer = Platform.CreateRenderer(view);
renderer.NativeView.Frame = size;
renderer.NativeView.AutoresizingMask = UIViewAutoresizing.All;
renderer.NativeView.ContentMode = UIViewContentMode.ScaleToFill;
renderer.Element.Layout(size.ToRectangle());
var nativeView = renderer.NativeView;
nativeView.SetNeedsLayout();
return nativeView;
}
然后在自定义渲染器中
var rect = new CGRect(0, 0, 250, 55);
_overlayTabView = Helpers.ConvertFormsToNative(new OverlayTabView(), rect);
var result = UIScreen.MainScreen.Bounds;
var x = (result.Width / 2) - 125;
var y = (result.Height - (55 + 20));
_overlayTabView.Frame = new CGRect(x, y, 250, 55);
RootView.AddSubView(_overlayTabView);
所以没关系! 现在是Android
public static Android.Views.View ConvertFormsToNative(Xamarin.Forms.View view, Rectangle size)
{
var renderer = Platform.CreateRendererWithContext(view, Android.App.Application.Context);
var nativeView = renderer.View;
renderer.Tracker.UpdateLayout();
var layoutParams = new ViewGroup.LayoutParams((int)size.Width, (int)size.Height);
nativeView.LayoutParameters = layoutParams;
view.Layout(size);
nativeView.Layout(0, 0, (int)view.WidthRequest, (int)view.HeightRequest);
return nativeView;
}
在自定义渲染器中
var rect = new Rectangle(0, 0, 250, 55);
_overlayView = Helpers.ConvertFormsToNative(new OverlayTabView(), rect);
((ViewGroup)CurrentView.Parent).AddView(_overlayView);
这确实创建了我调试时似乎正确的控件,但是当将其添加到UI时,我只会得到1个大的空白矩形。
不确定问题出在哪里,所以如果有人可以向我指出该原理的一些基本示例,那也许会很好。这样,我就可以根据自己的需要进行调整,因为XAML ContentView中也包含使用自定义渲染器本身的控件。 现在,仅在常规ContentPage中使用此ContentView即可在两个平台上正常工作。