web-dev-qa-db-fra.com

Est-il possible de changer la couleur de la ligne ci-dessous / Bordure d'un TextBox (Entry)

Je crée un Xamarin.Forms application sur Android et j'essaie de changer la couleur de la ligne sous mon Xamarin.FormsEntry contrôle.

J'ai un contrôle Entry comme ceci:

<Entry Text="new cool street"/>

enter image description here

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?

14
user1

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

30
root

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>
10
Curiousity

É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);
            }
        }
    }
}
5
djunod

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>
3
Ram Koti

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.

0
Bb23

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.

  1. Incluez l'entrée et deux autres variables comme champs de classe:
private CustomEntry _entry;
private double _yPos;
private double _width;
  1. Attribuez la valeur dans OnElementChanged:
if (e.NewElement != null)
    _entry = e.NewElement as CustomEntry;
  1. Dans 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);
0
mahclark

Si vous utilisez des formulaires Xamarin, accédez à Mobile.Droid, Ressources, valeurs et sur "Votre couleur", cela fonctionnera.

0