Je crée un Xamarin.Forms
application sur Android
et j'essaie de changer la couleur de la ligne sous mon Xamarin.Forms
Entry
contrôle.
J'ai un contrôle Entry
comme ceci:
<Entry Text="new cool street"/>
Je voudrais changer la couleur de la ligne en dessous de ce Entry
du blanc par défaut à plus d'un violet pour correspondre à mon thème.
Idéalement, il serait préférable de faire en utilisant Android Styles car cela s'appliquerait à tous les contrôles héritant de Entry
si possible
Est-ce possible?
vous pouvez utiliser un rendu personnalisé qui affectera toutes les entrées,
voici pour 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);
}
}
}
et 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);
}
}
}
pas sûr de la solution Windows sur ce
J'ai eu le même problème et j'ai juste changé la valeur de colorAccent
dans styles.xml (dans Xamarin.Android projet) changera la couleur du curseur et la bordure inférieure d'un champ Entry
.
<item name="colorAccent">#BA55D3</item>
Étant donné que j'ai les pages de contenu avec une couleur d'arrière-plan et les boîtes de dialogue avec une autre, l'utilisation de styles pour spécifier la couleur de la barre inférieure est totalement la mauvaise réponse. Et comme l'OP ne posait que des questions sur Android, c'est juste Android ...
J'utilise un rendu personnalisé pour définir la couleur de la barre inférieure de la même manière que la couleur du texte. Vous devez à la fois ElementChanged et 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);
}
}
}
}
simple: modifiez vos res/values / colours.xml comme: # 303F9F
Vous pouvez placer n'importe quel code couleur hexadécimal à la place de # 303F9F
<color name="colorPrimaryDark">#303F9F</color>
Une autre solution visuelle simple que vous pouvez utiliser consiste simplement à masquer cette ligne:
<Grid>
<Entry Placeholder="Your Entry"/>
<BoxView BackgroundColor="White" HeightRequest="10"/>
</Grid>
Vous pouvez l'améliorer en créant votre propre composant au lieu d'utiliser des couleurs codées en dur.
Si quelqu'un rencontre un problème de largeur ou de position y avec le rendu iOS personnalisé de root , j'ai trouvé une solution.
private CustomEntry _entry;
private double _yPos;
private double _width;
OnElementChanged
:if (e.NewElement != null)
_entry = e.NewElement as CustomEntry;
OnElementPropertyChanged
, incluez les éléments suivants:if (e.PropertyName == "Width")
{
_width = _entry.Width;
}
else if (e.PropertyName == "Height")
{
_yPos = _entry.Height;
}
_line.Frame = new CGRect(0, _yPos, _width, 1f);
Si vous utilisez des formulaires Xamarin, accédez à Mobile.Droid, Ressources, valeurs et sur "Votre couleur", cela fonctionnera.