Xamarin.Forms:添加基于平台的控件(在XAML中)

Xamarin.Forms: add control (in XAML) based on Platform

我使用 Xamarin Forms 在 XAML 中有这个(简化的)布局:

<controls:MyTabItemView>
    <ScrollView>
        <Grid>
            ......
                <controls:CustomButton x:Name="XYZ"/>
            ......
        </Grid>
    </ScrollView>
</controls:TabItemView>

这在 iOS 中很好,但在 Android 中,我不想要 ScrollView,主要容器应该是 Grid,所以像:

<controls:MyTabItemView>
    <Grid>
         ......
            <controls:CustomButton x:Name="XYZ"/>
         ......
    </Grid>
</controls:TabItemView>

如果我尝试使用 <OnPlatform><On Platform="Android" / "iOS"> 范例创建 2 个布局(基本上复制 XAML 中的所有内容,但删除 [=39] 中的 <ScrollView> =] 部分),这几乎可以工作,但是由于 XYZ 它将导致构建错误,因为 .g.cs 文件将声明 XYZ 两次。这是一个已知错误,请参阅:Xamarin OnPlatform - Duplicate Names

因此,由于我在 XAML 中无法做到,所以我尝试在 xaml.cs 视图构造函数中进行破解,

if (Xamarin.Forms.Device.RuntimePlatform == Xamarin.Forms.Device.Android)
{
    Children[0] = Children[0].Children[0];  //get rid of ScrollView
}

这不会编译,因为 ChildrenIReadOnlyList

任何建议,最好的解决方案是什么,在 Android 的情况下不添加 ScrollView,而是从 Grid 作为主要容器开始?

谢谢

因为您知道创建的布局,所以在 InitializeComponent(); 之后您可以这样进行替换:

var topLayout = (ScrollView)Children[0];
Children.RemoveAt(0);
Children.Insert(0, topLayout.Children[0]);

这会用第一个子项替换 ScrollView