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
}
这不会编译,因为 Children
是 IReadOnlyList
。
任何建议,最好的解决方案是什么,在 Android 的情况下不添加 ScrollView,而是从 Grid 作为主要容器开始?
谢谢
因为您知道创建的布局,所以在 InitializeComponent();
之后您可以这样进行替换:
var topLayout = (ScrollView)Children[0];
Children.RemoveAt(0);
Children.Insert(0, topLayout.Children[0]);
这会用第一个子项替换 ScrollView
。
我使用 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
}
这不会编译,因为 Children
是 IReadOnlyList
。
任何建议,最好的解决方案是什么,在 Android 的情况下不添加 ScrollView,而是从 Grid 作为主要容器开始?
谢谢
因为您知道创建的布局,所以在 InitializeComponent();
之后您可以这样进行替换:
var topLayout = (ScrollView)Children[0];
Children.RemoveAt(0);
Children.Insert(0, topLayout.Children[0]);
这会用第一个子项替换 ScrollView
。