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

Android
Вопрос: Я Xamarin.Forms приложение Xamarin.Forms на Android и пытаюсь изменить цвет линии под моим Xamarin.Forms управления Xamarin.Forms Entry. У меня есть элемент управления Entry следующим образом: Я хотел бы изменить цвет линии под этой Entry с белого по умолчанию на более фиолетовый, чтобы соответствовать моей теме. В идеале было бы лучше

Вопрос:

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

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

<Entry Text=»new cool street»/>

enter image description here

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

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

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

Лучший ответ:

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

здесь для 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

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

<item name=»colorAccent»>#BA55D3</item> Ответ №2

Так как у меня есть страницы контента с одним цветом фона и диалогами с другим, использование стилей для указания цвета нижнего штриха – это совершенно неправильный ответ. И поскольку 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); } } } } Ответ №3

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

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

<color name=»colorPrimaryDark»>#303F9F</color> Ответ №4

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

Ответ №5

Я реализовал это с помощью эффектов:

https://xamgirl.com/custom-renderers-vs-effects-in-xamarin-forms/

И вы можете передать свойство, как это:

https://rodneylittlesii.com/posts/topic/multiline-label-effect

Ответ №6

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

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

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

Ответ №7

Если кто-то испытывает неправильную работу ширины или 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);

Оцените статью
Добавить комментарий