Можно ли изменить цвет линии ниже /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", он будет работать.
Ответ 6
Я реализовал это с помощью эффектов:
https://xamgirl.com/custom-renderers-vs-effects-in-xamarin-forms/
И вы можете передать свойство, как это:
https://rodneylittlesii.com/posts/topic/multiline-label-effect
Ответ 7
Другое простое визуальное решение, которое вы можете использовать, это просто скрыть эту строку:
<Grid>
<Entry Placeholder="Your Entry"/>
<BoxView BackgroundColor="White" HeightRequest="10"/>
</Grid>
Вы можете улучшить его, создав собственный компонент вместо использования жестко закодированных цветов.
Ответ 8
Если кто-то испытывает неправильную работу ширины или 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);