Вопрос:
Я Xamarin.Forms приложение Xamarin.Forms на Android и пытаюсь изменить цвет линии под моим Xamarin.Forms управления Xamarin.Forms Entry.
У меня есть элемент управления Entry следующим образом:
<Entry Text=»new cool street»/>
Я хотел бы изменить цвет линии под этой 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, я нашел решение.
- Включите запись и еще две переменные в качестве полей класса:
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);