我有以下XAML行,它们使用Xamarin表单中的本机视图:
<androidWidget:RadioGroup x:Arguments="{x:Static formsAndroid:Forms.Context}">
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Click="RadioButton1Clicked"/>
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Click="RadioButton2Clicked"/>
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Click="RadioButton3Clicked"/>
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Click="RadioButton4Clicked"/>
</androidWidget:RadioGroup>
但是,抛出以下异常:&#34;无法设置androidWidget:RadioGroup的内容,因为它没有ContentPropertyAttribute&#34;
只是想知道是否有人可以帮我找到与RadioButtons相关的RadioGroup的正确XAML布局?
干杯
答案 0 :(得分:2)
但是,抛出以下异常:“无法设置androidWidget的内容:RadioGroup,因为它没有ContentPropertyAttribute”
并非所有本机视图都可以直接在xaml中使用。 RadioGroup
就是其中之一。
要在Xaml中使用它,您需要按照以下步骤操作:
在YourProject.Droid
中创建自定义RadioGroup
控件:
public class MyRadioGroup:RadioGroup
{
//Every native control in xaml will be wrapped in NativeViewWrapper, so we want to pass a NativeViewWrapper list here
IList<NativeViewWrapper> items;
public IList<NativeViewWrapper> ItemsSource
{
get {
items.Clear();
for (int i = 0; i < this.ChildCount; i++)
{
items.Add(new NativeViewWrapper(this.GetChildAt(i)));
}
return items;
}
set {
//xaml compiler will call this setter
if (items != value)
{
items = value;
this.RemoveAllViews();
foreach (NativeViewWrapper wrapper in items)
{
this.AddView(wrapper.NativeView);
}
}
}
}
public MyRadioGroup(Context context) : base(context)
{
items = new List<NativeViewWrapper>();
}
}
在您的pcl库中添加必要的命名空间:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
...
xmlns:androidWrapper="clr-namespace:Xamarin.Forms.Platform.Android;assembly=Xamarin.Forms.Platform.Android;targetPlatform=Android"
xmlns:androidWidget="clr-namespace:Android.Widget;assembly=Mono.Android;targetPlatform=Android"
xmlns:androidLocal="clr-namespace:NativeSwitch.Droid;assembly=NativeSwitch.Droid;targetPlatform=Android"
xmlns:formsAndroid="clr-namespace:Xamarin.Forms;assembly=Xamarin.Forms.Platform.Android;targetPlatform=Android"
xmlns:local="clr-namespace:NativeSwitch"
...">
在您的xaml页面中引用自定义MyRadioGroup
:
<StackLayout Margin="20">
<androidLocal:MyRadioGroup x:Arguments="{x:Static formsAndroid:Forms.Context}" >
<androidLocal:MyRadioGroup.ItemsSource>
<x:Array Type="{x:Type androidWrapper:NativeViewWrapper}">
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Text="Scale1" />
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Text="Scale2" />
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Text="Scale3" />
<androidWidget:RadioButton x:Arguments="{x:Static formsAndroid:Forms.Context}" Text="Scale4" />
</x:Array>
</androidLocal:MyRadioGroup.ItemsSource>
</androidLocal:MyRadioGroup>
</StackLayout>
您可以找到完整的演示here。
有关类似的官方教程,请参阅Subclassing Native Views
要在Xaml中传递参数,请参阅Passing Arguments in Xaml