shuhelohelo’s blog

Xamarin.Forms多めです.

Entryの下線部の色を変える

Entryコントロールのカーソルの色を変えたいのだけれど,その途中で見つけたEntryコントロールの下線部の色を変更する方法.

kotaeta.com

カスタムレンダラーで変更する.Custom Renerer

Android.

[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace Android.MyRenderers
{
    public class MyEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            if (Control == null || e.NewElement == null) return;

            if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                Control.BackgroundTintList = ColorStateList.ValueOf(Color.White);
            else
                Control.Background.SetColorFilter(Color.White, PorterDuff.Mode.SrcAtop);
         }    
    }
}

iOS

[assembly: ExportRenderer (typeof(Entry), typeof(MyEntryRenderer))]
namespace iOS.MyRenderers
{
    public class MyEntryRenderer : EntryRenderer
    {
        private CALayer _line;

        protected override void OnElementChanged(ElementChangedEventArgs e)
        {
            base.OnElementChanged (e);
            _line = null;

            if (Control == null || e.NewElement == null)
                return;

            Control.BorderStyle = UITextBorderStyle.None;

            _line = new CALayer {
                BorderColor = UIColor.FromRGB(174, 174, 174).CGColor,
                BackgroundColor = UIColor.FromRGB(174, 174, 174).CGColor,
                Frame = new CGRect (0, Frame.Height/2, Frame.Width * 2, 1f)
            };

            Control.Layer.AddSublayer (_line);
        }
    }
}

これはシンプルなのに,なぜカーソルとなると途端に見つからないのか.

上記に少し手を加えてXamarin.Forms.ColorからAndroid.Graphics.Colorに変換して使っている.

[assembly:ExportRenderer(typeof(Entry),typeof(MyEntryRenderer))]
namespace TakeMeThereXamarinForms.Droid.Renderers
{
    class MyEntryRenderer : EntryRenderer
    {
        public MyEntryRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control == null || e.NewElement == null) return;

            if(Build.VERSION.SdkInt>=BuildVersionCodes.Lollipop)
            {
                //下線の色を変更
                var color = Color.FromHex("#9BFFE6");
                Control.BackgroundTintList = ColorStateList.ValueOf(color.ToAndroid());
            }
        }
    }
}