Xamarin中的RadioGroup表示原生视图

时间:2018-01-12 10:41:37

标签: c# xaml xamarin.forms xamarin.android

我有以下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布局?

干杯

1 个答案:

答案 0 :(得分:2)

  

但是,抛出以下异常:“无法设置androidWidget的内容:RadioGroup,因为它没有ContentPropertyAttribute”

并非所有本机视图都可以直接在xaml中使用。 RadioGroup就是其中之一。

要在Xaml中使用它,您需要按照以下步骤操作:

  1. 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>();
        }
    }
    
  2. 在您的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"
    ...">
    
  3. 在您的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>
    
  4. 您可以找到完整的演示here

    有关类似的官方教程,请参阅Subclassing Native Views

    要在Xaml中传递参数,请参阅Passing Arguments in Xaml