如何实现 Xamarin.Forms 自定义 RadioButton 渲染器? (转发)

How to implement Xamarin.Forms custom RadioButton renderer? (repost)

注意:几天前我最初 post 编辑了它,但由于 insufficient/unclear 细节而被关闭。希望这次 repost 能通过考试

我正在使用 Xamarin.Forms 创建一个 Android/iOS 应用程序。
我发现选定的 RadioButtons 在 Android:
上呈现为红色
我想在我的应用主题中使用不同的颜色。

我找到了一个 Xamarin 论坛 post,它描述了这方面的标准机制,即通过在 Android 项目中添加以下代码 来实现自定义渲染器:

[assembly: ExportRenderer(typeof(Xamarin.Forms.RadioButton), typeof(MyRenderer))]
namespace MyApp.Droid
{
    public class MyRenderer : RadioButtonRenderer
    {
        public MyRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
        {
            base.OnElementChanged(e);

            if(Control != null)
            {
                Control.ButtonTintList = ColorStateList.ValueOf(Android.Graphics.Color.Yellow);
            }
        }
    }
}

我已经添加了代码(渲染器在我的 Android 项目中);它编译、运行(在 Android 上)、按钮出现和运行等
但是,MyRenderer() 和 OnElementChanged() 都没有被调用。

是否需要额外的东西才能使应用程序使用自定义渲染器?

谢谢!

答案是自定义渲染器似乎只适用于 自定义 classes.
因此,为了使其正常工作,您 必须 定义您自己的自定义 class 并 将渲染器附加到您的 class .当我应该引用我的类型时,我引用了 Xamarin.Forms.RadioButton。

有效吗:

ExportRenderer(typeof(Xamarin.Forms.RadioButton), ...

是否有效:

ExportRenderer(typeof(MyApp.MyRadio), ...

因此,最小的工作实施是在您的主项目中创建您的自定义 class(Android 或 iOS 具体):

namespace MyApp
{
   // All that's needed is the simplest derived class ever:
   public class MyRadio : RadioButton
   {
   }
}

然后在您的 Android 项目中:

[assembly: ExportRenderer(typeof(MyApp.MyRadio), typeof(MyApp.Droid.MyRenderer))]
namespace MyApp.Droid
{
   ... same as the code in the question above
}