是否可以更改TextBox(条目)下边框/颜色

时间:2016-07-05 15:20:47

标签: c# android xamarin xamarin.forms

我正在Xamarin.Forms创建一个Android应用,我正在尝试更改Xamarin.Forms Entry控件下方的行颜色。

我有一个Entry控件,如下:

<Entry Text="new cool street"/>

enter image description here

我想将此Entry下方的线条颜色从默认白色更改为紫色,以匹配我的主题。

理想情况下,最好使用Android样式,因为它适用于从Entry继承的所有控件(如果可能)

这可能吗?

9 个答案:

答案 0 :(得分:24)

您可以使用会影响所有条目的自定义渲染器,

这里是android:

[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace Android.MyRenderers
{
    public class MyEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Entry> 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<Entry> 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);
        }
    }
}

对此

的Windows解决方案不确定

答案 1 :(得分:7)

我遇到了同样的问题,只是更改 styles.xml 中的Entry值(在 Xamarin.Android 项目中)将更改游标的颜色以及<item name="colorAccent">#BA55D3</item> 字段的下边框。

library(readxl)

答案 2 :(得分:3)

简单: 将res / values / colors.xml编辑为:     #303F9F

您可以放置​​任何十六进制颜色代码来代替#303F9F

<color name="colorPrimaryDark">#303F9F</color>

答案 3 :(得分:3)

由于我的内容页面有一种背景颜色和对话框,因此使用样式指定底栏颜色完全是错误的答案。由于OP只询问Android,这只是Android ......

我使用自定义渲染器将底栏颜色设置为与文本颜色相同。必须同时使用ElementChanged和PropertyChanged。

[assembly: ExportRenderer(typeof(Xamarin.Forms.Entry), typeof(CustomEntryRenderer))]
namespace XamFormsConnect.Droid
{
    public class CustomEntryRenderer : EntryRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Entry> e)
        {
            base.OnElementChanged(e);

            if (Control != null && e.NewElement != null)
            {
                var entry = (Xamarin.Forms.Entry)e.NewElement;
                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                    Control.BackgroundTintList = ColorStateList.ValueOf(entry.TextColor.ToAndroid());
                else
                    Control.Background.SetColorFilter(entry.TextColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);

            if (e.PropertyName == "TextColor")
            {
                var entry = (Xamarin.Forms.Entry)sender;
                if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                    Control.BackgroundTintList = ColorStateList.ValueOf(entry.TextColor.ToAndroid());
                else
                    Control.Background.SetColorFilter(entry.TextColor.ToAndroid(), PorterDuff.Mode.SrcAtop);
            }
        }
    }
}

答案 4 :(得分:1)

如果有人在root的iOS自定义渲染器中遇到宽度或y位置错误的情况,我找到了解决方法。

  1. 包括条目和另外两个变量作为类字段:
private CustomEntry _entry;
private double _yPos;
private double _width;
  1. OnElementChanged中分配值:
if (e.NewElement != null)
    _entry = e.NewElement as CustomEntry;
  1. OnElementPropertyChanged中,包括以下内容:
if (e.PropertyName == "Width")
{
    _width = _entry.Width;
}
else if (e.PropertyName == "Height")
{
    _yPos = _entry.Height;
}
_line.Frame = new CGRect(0, _yPos, _width, 1f);

答案 5 :(得分:1)

更新: Xamarin.Forms 2.5

我正在尝试使用评分最高的解决方案(https://stackoverflow.com/a/38227299/11630806),并出现错误:“从2.5版开始,上下文已过时。请改为使用本地上下文。”

经过快速搜索:

代码需要更新:

using <YOUR_APP_NAME>.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using Android.Content;
using Android.OS;
using Android.Content.Res;
using Android.Graphics;

[assembly: ExportRenderer(typeof(Entry), typeof(MyRenderers))]
namespace Android.MyRenderers
{
    public class MyRenderers : EntryRenderer
    {

        public MyRenderers(Context context) : base(Android.App.Application.Context)
        {

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

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

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

谁需要更新。

答案 6 :(得分:0)

如果您使用的是Xamarin Forms,请转到Mobile.Droid,资源,值以及&#34; Your Colur&#34;,它将起作用。

答案 7 :(得分:0)

您可以使用的另一种简单的视觉解决方案就是隐藏此行:

<Grid>
   <Entry Placeholder="Your Entry"/>
   <BoxView BackgroundColor="White" HeightRequest="10"/>
</Grid>

您可以通过创建自己的组件而不是使用硬编码的颜色来改进它。

答案 8 :(得分:0)

在android中将输入光标和下划线颜色从粉红色更改。只需在您的styles.xml文件中添加<item name="colorControlActivated">#007bff</item>即可实现,该文件位于Xamarin表单Android项目的Resources / values文件夹中。

注意:这种方法会将更改应用于应用程序中的每个元素。如果不需要,请使用自定义渲染器方法。

可以参考xamarin forums

的答案