Можно ли изменить цвет линии ниже /Border TextBox (Entry)

Я Xamarin.Forms приложение Xamarin.Forms на Android и пытаюсь изменить цвет линии под моим Xamarin.Forms управления Xamarin.Forms Entry.

У меня есть элемент управления Entry следующим образом:

<Entry Text="new cool street"/>

enter image description here

Я хотел бы изменить цвет линии под этой Entry с белого по умолчанию на более фиолетовый, чтобы соответствовать моей теме.

В идеале было бы лучше использовать стили Android, так как это применимо ко всем элементам управления, наследуемым от Entry если это возможно

Возможно ли это сделать?

Ответ 1

вы можете использовать собственный рендерер, который будет влиять на все записи,

здесь для 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 на этом

Ответ 2

У меня была та же проблема, и просто изменение значения colorAccent в styles.xml (в проекте Xamarin.Android) изменит цвет курсора и нижнюю границу Entry поле.

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

Ответ 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

просто: отредактируйте свои res/values ​​/colors.xml как:   # 303F9F

Вы можете поместить любой шестнадцатеричный код цвета вместо # 303F9F

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

Ответ 5

Если вы используете Xamarin Forms, перейдите на Mobile.Droid, ресурсы, значения и в "Your Colur", он будет работать.

Ответ 7

Другое простое визуальное решение, которое вы можете использовать, это просто скрыть эту строку:

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

Вы можете улучшить его, создав собственный компонент вместо использования жестко закодированных цветов.

Ответ 8

Если кто-то испытывает неправильную работу ширины или y с корневым пользовательским средством визуализации iOS, я нашел решение.

  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);