是否可以更改文本框下方线条/边框的颜色(条目)

Posted

技术标签:

【中文标题】是否可以更改文本框下方线条/边框的颜色(条目)【英文标题】:Is it possible to change the colour of the line below / Border of a TextBox (Entry) 【发布时间】:2016-11-07 12:16:05 【问题描述】:

我正在android 上创建一个Xamarin.Forms 应用程序,并且我正在尝试更改我的Xamarin.Forms Entry 控件下方线条的颜色。

我有一个像这样的Entry 控件:

<Entry Text="new cool street"/>

我想将此 Entry 下面的行的颜色从默认的白色更改为更多的紫色以匹配我的主题。

如果可能的话,最好使用 Android 样式,因为它适用于从 Entry 继承的所有控件

这样可以吗?

【问题讨论】:

用户安卓样式。 &lt;item name="colorAccent"&gt;@android:color/yourcolour&lt;/item&gt; @AkashAmin colorAccent 仅在 TextBox 被聚焦时使用。我希望在 TextBox 未聚焦时更改线条颜色 How to change Border Color of Entry in Xamarin.Forms的可能重复 【参考方案1】:

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

这是安卓版:

[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 解决方案

【讨论】:

您的示例适用于什么平台,您知道我在哪里可以找到其他两个示例的代码吗? @user1,这是安卓,刚刚添加了iOS 谢谢,太好了!如果我发现了,我会查看 windows 并添加它 我想吻你!谢谢老兄 你遇到过ios入口底线宽度问题吗?【参考方案2】:

我遇到了同样的问题,只需更改 styles.xml(在 Xamarin.Android 项目中)中的 colorAccent 值就会改变光标的颜色和Entry 字段的底部边框。

<item name="colorAccent">#BA55D3</item>

【讨论】:

看起来只有当控件有焦点时才会改变颜色。 聚焦:#FF73B72F 未聚焦:#FF73B72F"【参考方案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);
            
        
    

【讨论】:

我喜欢这个答案如何使用 TextColor 属性,而不是像接受的答案那样硬编码“白色”。【参考方案4】:

更新: Xamarin.Forms 2.5

我尝试了top rated solution,但出现错误:“上下文从 2.5 版开始已过时。请改用本地上下文”。

经过一番快速搜索:

Xamarin.Forms 2.5.0 and Context https://forums.xamarin.com/discussion/106938/context-is-obsolete-as-of-version-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);
        
    

谁需要更新。

【讨论】:

【参考方案5】:

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

您可以使用任何十六进制颜色代码代替#303F9F

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

【讨论】:

我在哪里实现这个颜色以将它应用到我的Entry?到目前为止,这只是定义一个新的颜色 请参阅https://developer.xamarin.com/guides/android/user_interface/material_theme/ 了解我的意思的更多信息【参考方案6】:

如果有人在使用root 的 iOS 自定义渲染器时遇到宽度或 y 位置异常,我找到了解决方案。

    包括条目和另外两个变量作为类字段:
private CustomEntry _entry;
private double _yPos;
private double _width;
    OnElementChanged中赋值:
if (e.NewElement != null)
    _entry = e.NewElement as CustomEntry;
    OnElementPropertyChanged 中,包括以下内容:
if (e.PropertyName == "Width")

    _width = _entry.Width;

else if (e.PropertyName == "Height")

    _yPos = _entry.Height;

_line.Frame = new CGRect(0, _yPos, _width, 1f);

【讨论】:

【参考方案7】:

如果您使用的是 Xamarin 表单,请转到 Mobile.Droid、资源、值并在“您的颜色”上,它会起作用。

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

在android中将输入光标和下划线颜色从粉红色更改。这可以通过将&lt;item name="colorControlActivated"&gt;#007bff&lt;/item&gt; 添加到您的styles.xml 文件来实现,该文件位于Xamarin 表单Android 项目的Resources/values 文件夹中。

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

可以参考xamarin forums这个答案

【讨论】:

【参考方案10】:

上述解决方案已过时。这里的这个是推荐的。 (还有所有必要的用途。有时会让人困惑......)

using System;
using System.ComponentModel;
using Android.Content;
using Android.Content.Res;
using InteriorCircle.Droid.CustomComp;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(Entry), typeof(CustomEntry))]
namespace InteriorCircle.Droid.CustomComp

    public class CustomEntry : EntryRenderer
    
        public CustomEntry(Context context) : base(context)
        

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

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

            Control.BackgroundTintList = Android.Content.Res.ColorStateList.ValueOf(Android.Graphics.Color.Black);
        

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        
            base.OnElementPropertyChanged(sender, e);
            if (e.PropertyName == Entry.TextProperty.PropertyName)
            
                if (Control.Text.Length > 6)  //this is your condition(For example, here is the length of the text content)
                
                    Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Red);
                
                else
                
                    Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Black);
                
            
        

    

【讨论】:

以上是关于是否可以更改文本框下方线条/边框的颜色(条目)的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 UIDatePicker 的线条颜色

C#文本框边框颜色如何改变

如何有条件地格式化连续形式的文本框边框?

在 nativescript 中使用 RadDataForm 聚焦时更改文本字段的线条颜色

PPT中的文本框怎么设置半边框架有颜色,半边框架无色,或者只设置一条边框有颜色,其它均透明?

访问:检查文本框是不是为空,如果是则更改文本框背景颜色