将 Xamarin Forms 视图注入 Android 视图

Dep*_*hie 6 android xamarin.forms

我有一个 Xamarin Forms ContentView,其 UI 在 XAML 中定义。当使用某个自定义渲染器时,应动态添加此视图到应用程序的根视图。

对于 iOS,这工作得很好,但在 Android 上,我没有得到像 XAML 中定义的正确的 UI。只是得到 1 个大矩形,没有其他东西。

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;
}
Run Code Online (Sandbox Code Playgroud)

然后在自定义渲染器中

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);
Run Code Online (Sandbox Code Playgroud)

所以这没关系!现在安卓

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;
}
Run Code Online (Sandbox Code Playgroud)

并在自定义渲染器中

var rect = new Rectangle(0, 0, 250, 55);
_overlayView = Helpers.ConvertFormsToNative(new OverlayTabView(), rect);
((ViewGroup)CurrentView.Parent).AddView(_overlayView);
Run Code Online (Sandbox Code Playgroud)

当我调试时,这确实创建了正确的控件,但是当它被添加到 UI 时,我只得到 1 个大的空矩形。

不确定问题出在哪里,所以如果有人能给我指出这个原则的一些基本例子,那就太好了。这样我就可以根据自己的需要进行定制,因为 XAML ContentView 中也包含使用自定义渲染器本身的控件。现在,只需在常规 ContentPage 中使用此 ContentView 在两个平台上都可以正常工作。