C# 更改Xamarin表单中条目控件的焦点颜色

C# 更改Xamarin表单中条目控件的焦点颜色,c#,android,xaml,xamarin.forms,custom-controls,C#,Android,Xaml,Xamarin.forms,Custom Controls,如何在Xamarin表单中更改条目控件中的焦点边框和光标颜色?在模拟器中,它是标准的红色 我在我的Android项目中添加了这个 [assembly: ExportRenderer(typeof(CustomEntryControl), typeof(MyEntryRenderer))] namespace MyApp.Droid { public class MyEntryRenderer : EntryRenderer { protected override

如何在Xamarin表单中更改条目控件中的焦点边框和光标颜色?在模拟器中,它是标准的红色

我在我的Android项目中添加了这个

[assembly: ExportRenderer(typeof(CustomEntryControl), typeof(MyEntryRenderer))]
namespace MyApp.Droid
{
    public class MyEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                Control.SetBackgroundColor(global::Android.Graphics.Color.LightGreen);
            }
        }
    }
}
[程序集:ExportRenderer(typeof(CustomEntryControl)、typeof(MyEntryRenderer))]
名称空间MyApp.Droid
{
公共类MyEntryRenderer:EntryRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
Control.SetBackgroundColor(全局::Android.Graphics.Color.LightGreen);
}
}
}
}
但找不到边框或光标的属性

尝试下面的代码

  public class EntryCustomRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control != null)
        {
            Control.SetBackgroundColor(global::Android.Graphics.Color.Transparent);

            // set the cursor color the same as the entry TextColor
            IntPtr IntPtrtextViewClass = JNIEnv.FindClass(typeof(TextView));
            IntPtr mCursorDrawableResProperty = 
                   JNIEnv.GetFieldID(IntPtrtextViewClass, "mCursorDrawableRes", "I");
            // replace 0 with a Resource.Drawable.my_cursor 
            JNIEnv.SetField(Control.Handle, mCursorDrawableResProperty, 0); 
        }
    }
}
公共类EntryCustomRenderer:EntryRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(控件!=null)
{
Control.SetBackgroundColor(全局::Android.Graphics.Color.Transparent);
//将光标颜色设置为与条目TextColor相同
IntPtr IntPtrtextViewClass=JNIEnv.FindClass(typeof(TextView));
IntPtr mCursorDrawableResProperty=
GetFieldID(IntPtrtextViewClass,“mCursorDrawableRes”,“I”);
//将0替换为Resource.Drawable.my_光标
JNIEnv.SetField(Control.Handle,mCursorDrawableResProperty,0);
}
}
}

请注意,如果为条目设置了TextColor,则如果资源id保留“0”值,光标将使用该颜色。您可以在style.xml文件中更改Android项目中的条目焦点颜色。路径是:Resources/values/styles.xml

然后,查看“colorAccent”属性以设置自定义颜色


您好,请尝试使用此代码将iOS条目更改为本机Android条目 在ios部分中添加此渲染器;焦点和非焦点颜色也在变化

记住这一行添加到名称空间上方 [程序集:ExportRenderer(typeof(Entry)、typeof(CustomEntryRenderer))]

公共类CustomEntryRenderer:EntryRenderer { 私人CALayer_边界层; 受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e) { 基础。一个要素发生变化(e); if(Control==null) 返回; Control.BorderStyle=UITextBorderStyle.None; var元素=元素作为条目; if(元素==null) 返回; //DrawBorder(element.BorderColor.togcolor()); 绘图边框(UIColor.FromRGB(156156156)); e、 NewElement.Unfocused+=(发送方,evt)=> { 绘图边框(UIColor.FromRGB(156156156));//未聚焦,设置颜色 }; e、 NewElement.Focused+=(发送方,evt)=> { 绘图边框(UIColor.FromRGB(245,0,47));//聚焦,设置颜色 }; } 受保护的覆盖无效OnElementPropertyChanged(对象发送方,PropertyChangedEventArgs e) { base.OnElementPropertyChanged(发送方,e); var元素=元素作为条目; if(元素==null) 返回; 绘图边框(UIColor.FromRGB(156156156)); } 公共覆盖CGRect帧 { 获取{return base.Frame;} 设置 { 基本帧=值; var元素=元素作为条目; if(元素==null) 返回; //DrawBorder(element.BorderColor.togcolor()); 绘图边框(UIColor.FromRGB(156156156)); } } 专用空心抽框(UIColor borderColor) {
如果(Frame.Height aah),但我使用的是Xamarin表单,而不是原生的Androidk稍后将尝试此操作!希望它对您有所帮助
public class CustomEntryRenderer : EntryRenderer
{
    private CALayer _borderLayer;
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
            return;

        Control.BorderStyle = UITextBorderStyle.None;

        var element = Element as Entry;
        if (element == null)
            return;

        //DrawBorder(element.BorderColor.ToCGColor());
        DrawBorder(UIColor.FromRGB(156, 156, 156));

        e.NewElement.Unfocused += (sender, evt) =>
        {
            DrawBorder(UIColor.FromRGB(156, 156, 156)); // unfocused, set color

        };
        e.NewElement.Focused += (sender, evt) =>
        {
            DrawBorder(UIColor.FromRGB(245, 0, 47)); ; // focused, set color
        };
    }
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        var element = Element as Entry;
        if (element == null)
            return;

        DrawBorder(UIColor.FromRGB(156, 156, 156));
    }
    public override CGRect Frame
    {
        get { return base.Frame; }
        set
        {
            base.Frame = value;

            var element = Element as Entry;
            if (element == null)
                return;

            // DrawBorder(element.BorderColor.ToCGColor());
            DrawBorder(UIColor.FromRGB(156, 156, 156));
        }
    }
    private void DrawBorder(UIColor borderColor)
    {
        if (Frame.Height <= 0 || Frame.Width <= 0)
            return;

        if (_borderLayer == null)
        {
            _borderLayer = new CALayer
            {
                MasksToBounds = true,
                Frame = new CGRect(0f, Frame.Height - 1, Frame.Width, 1f),
                BorderColor = borderColor.CGColor,
                BorderWidth = 1.0f
            };

            Control.Layer.AddSublayer(_borderLayer);
            Control.BorderStyle = UITextBorderStyle.None;
        }
        else
        {
            _borderLayer.BorderColor = borderColor.CGColor;
            _borderLayer.Frame = new CGRect(0f, Frame.Height - 1, Frame.Width, 1f);
        }
    }
}