Xamarin.Les formes ListView: Définir la couleur de mise en évidence d'un élément taraudé
À L'Aide De Xamarin.Les formes, comment puis-je définir le point culminant/couleur d'arrière-plan sélectionnée/taraudés élément ListView?
(Ma liste a un arrière-plan noir et blanc, couleur du texte, de sorte que la valeur par défaut couleur de surbrillance sur iOS est trop lumineux. En revanche, sur Android il n'y a pas de mise en évidence de tous jusqu'à un subtil horizontale de la ligne grise.)
Exemple: (à gauche: iOS, à droite: Android; tout en appuyant sur la touche "Barn2")
InformationsquelleAutor Falko | 2014-09-17
Vous devez vous connecter pour publier un commentaire.
Dans Android il vous suffit de modifier votre styles.xml fichier de moins de Ressources\les valeurs de l'ajout de cette:
Il semble qu'il y est fait une croix-plate-forme de façon de faire qui fonctionne à la fois sur iOS et Android (pas sûr à propos de Windows). Il utilise seulement contraignant et ne nécessite pas coutume moteurs de rendu (ce qui semble rare). C'est un mash-up de beaucoup de googler, merci donc à toute personne à qui j'ai emprunté...
Je suis en supposant que ViewCells, mais cela devrait fonctionner pour le Texte ou l'Image des cellules. Je ne suis que le code ici-delà de l'habituelle texte, image, etc.
Sur votre page de faire quelque chose comme ceci:
Votre Modèle personnalisé peut ressembler à quelque chose comme ceci:
Alors pour votre ItemTemplate vous avez besoin d'une cellule personnalisé de classe à quelque chose comme ceci:
Puis dans votre ItemSelected gestionnaire d'événements, procédez de la manière suivante. Notez que "sélectionnées" est une instance de Monmodèle utilisé pour le suivi de l'élément actuellement sélectionné. Je veux seulement montrer la couleur de fond ici, mais j'utilise aussi cette technique pour inverser mettez en surbrillance le texte et le détail les couleurs de texte.
Color
n'est pas vraiment lié avec le modèle lui-même - il est strictement de l'INTERFACE utilisateur de la matière et le cadre dépendante (Formulaires dans ce cas). Réglage de savoirIsSelected
drapeau dans le modèle avec un convertisseur ou un style de déclenchement en XAML serait plus portable solution.iOS
Solution:
Au sein d'un
ViewCellRenderer
vous pouvez définir laSelectedBackgroundView
. Il suffit de créer un nouveauUIView
avec une couleur d'arrière-plan de votre choix et vous êtes fixés.Résultat:
Remarque:
Avec Xamarin.Il semble important de créer un nouveau
UIView
plutôt que de simplement définir la couleur d'arrière-plan de l'actuel.Android
Solution:
La solution que j'ai trouvé sur Android est un peu plus compliqué:
Créer un nouveau drawable
ViewCellBackground.xml
dans leResources
>drawable
dossier:Il définit les formes solides avec des couleurs différentes pour les paramètres par défaut et les "pressés" de l'état d'un élément de l'INTERFACE utilisateur.
Utiliser une classe héritée de la
View
de votreViewCell
, par exemple:Mettre en œuvre une coutume moteur de rendu pour cette classe de réglage de l'arrière-plan des ressources:
Résultat:
SetNeedsDisplay
ou ` "` SetNeedsLayout` " ne fonctionne pas. Mais il n'a pas vraiment d'importance, puisque l'attributionnew UIView {...}
est un joli court de solution de contournement.J'ai un processus similaire, complètement croix-plate-forme, cependant je suivre l'état de sélection de moi-même et je l'ai fait dans le code XAML.
Puis dans le ItemTapped Événement
Comme vous pouvez le voir je viens de mettre la Liste.SelectedItem à null pour supprimer tout de la plate-forme spécifique sélection de styles qui entrent en jeu.
Dans mon modèle, j'ai
ItemSelected
événement nouveau, dans mon cas, le code supplémentaire, a couru dans d'exception.J'ai eu ce même problème et je l'ai résolu par la création d'un moteur de rendu personnalisé pour iOS que Falko suggère, cependant, j'ai évité les styles de modification pour Android, j'ai trouvé un moyen d'utiliser un moteur de rendu pour Android ainsi.
Il est une sorte de funky comment l'indicateur sélectionné est toujours faux pour l'androïde vue de la cellule c'est pourquoi j'ai dû créer une nouvelle propriété privée à la suivre. mais d'autres que je pense que cela fait suite à plus de modèle approprié si vous voulez utiliser des convertisseurs pour les deux plates-formes, Dans mon cas, je l'ai fait pour TextCell mais je crois qu'elle s'applique de la même manière pour les autres CellViews.
Xamarin Forms
iOS
Android
...puis, dans le .xaml page, vous devez ajouter un XMLNS référence à la nouvelle CustomViewCell...
Et n'oubliez pas de faire un usage effectif de la nouvelle Coutume comtrol dans votre XAML.
CustomTextCell
à utiliserCustomTextCellRenderer
? Est-il un attribut que je suis absent?Ici est purement de la croix-plate-forme et de façon soignée:
1) Définir un déclencheur d'action
2) s'Appliquent à la classe ci-dessus instance comme un EventTrigger action dans le code XAML comme ci-dessous
N'oubliez pas d'ajouter
xmlns:customTriggers="clr-namespace:CustomTriggers;assembly=ProjectAssembly"
Remarque: Parce qu'aucun de vos articles sont dans le mode sélectionné, la sélection de style ne sera pas appliquée sur l'une des plates-formes.
ListView
est exploité, mais veut supprimer l'élément sélectionné.Afin de définir la couleur de l'élément mis en surbrillance, vous devez définir la couleur de
cell.SelectionStyle
dans iOS.De cet exemple est de définir la couleur de taraudés élément transparent.
Si vous le souhaitez, vous pouvez le modifier avec d'autres couleurs de
UITableViewCellSelectionStyle
. C'est écrit dans le projet de plate-forme de l'iOS par la création d'une nouvelle Custom ListView rendu dans votre projet de Formulaires.Pour android, vous pouvez ajouter ce style dans votre values/styles.xml
e.PropertyName == "ItemsSource"
àe.PropertyName == "SelectedItem"
de l'obtenir pour fonctionner correctement.UITableViewCellSelectionStyle
ne mentionne que deux couleurs, le bleu et le gris.Trouvé cette belle option à l'aide des effets ici.
iOS:
Android:
Formes:
Cette solution fonctionne très bien, mais si vous modifiez la stratégie de mise en cache de la liste à l'écart de la valeur par défaut, il s'arrête de fonctionner. Il fonctionne si vous avez des nouvelles de votre ListView comme ceci:
listView = new ListView() { ... };
Mais si vous faites cela, il ne fonctionne pas (le fond reste le gris de l'élément sélectionné):
listView = new ListView(cachingStrategy:ListViewCachingStrategy.RecycleElement) { ... };
Ci-dessous est une solution qui fonctionne même avec une non-standard cachingStrategy. Je préfère cela à d'autres solutions comme ayant le code de la OnItemSelected méthode couplée avec une liaison à partir de ce Dernier pour la couleur d'arrière-plan.
De crédit à @Lang_tu_bi_dien qui a posté l'idée ici: Listview Élément Sélectionné À L'Arrière-Plan De Couleur
Le code final ressemble alors à ceci:
Xamarin.Les formes de code:
XAML sur votre page:
HTML:
iOS-convertisseur spécifique:
Remarque: vous risquez de rencontrer quelques problèmes en raison du fait que vous remplacez la valeur par défaut de délégué, pour plus d'infos voir sur ce Réglage délégué de contrôle dans la coutume de rendu de résultats de perte de fonctionnalité. Dans mon projet, tout fonctionne comme il se doit si je fais ceci:
Utiliser la normale ListView avec le ListItemViewCellRenderer de code donné dans dans les précédents posts sur ce thread pour les ListViews que d'utiliser la mise en cache par défaut de la stratégie de ListViewCachingStrategy.RetainElement.
Utiliser cette ListView2 ensemble pour les ListViews que l'utilisation d'un non-par défaut de la stratégie de mise en cache c'est à dire ListViewCachingStrategy.RecycleElement ou ListViewCachingStrategy.RecycleElementAndDataTemplate.
Je suis également le dépôt d'une demande de fonctionnalité avec Xamarin, veuillez upvote si vous vous sentez cela devrait être ajouté à la norme ListView: ListView a désespérément besoin d'un SelectedItemBackgroundColor propriété
J'ai & utiliser une solution similaire à @adam-pedley.
Aucun moteurs de rendu, dans le code xaml je la lie de fond ViewCell Propriété
Dans le code (MVVM) j'ai enregistrer le lastitemselected par un boolToColor Convertisseur-je mettre à jour couleur d'arrière-plan
Mon exemple est extrait par une liste de lieux qui sont dans un Xamarin Forms Cartes (même contentpage).
J'espère que cette solution sera utile pour quelqu'un
La façon la plus simple pour faire ça sur android est en ajoutant le code suivant à votre style personnalisé :
@android:couleur/transparent
Pour changer la couleur de certains
ViewCell
, il est un processus simple, sans l'aide personnalisée de rendu. FaireTapped
événement de votreViewCell
comme ci-dessousDans votre ContentPage ou .cs de fichier, de mettre en œuvre l'événement
Déclarer
lastCell
en haut de votreContentPage
comme ceViewCell lastCell;
Seulement pour Android
Ajouter dans votre thème
Les réponses précédentes, soit suggèrent personnalisé convertisseurs ou vous obliger à garder une trace de l'élément sélectionné dans vos objets de données ou autre. Ce n'est pas vraiment nécessaire, il existe un moyen de lien pour le fonctionnement de l'
ListView
dans une plate-forme de façon agnostique. Cela peut ensuite être utilisé pour modifier l'élément sélectionné en quelque sorte nécessaire. Les couleurs peuvent être modifiés, les différentes parties de la cellule affichée ou masquée en fonction de l'état sélectionné.Ajoutons une
IsSelected
propriété à notreViewCell
. Il n'est pas nécessaire de l'ajouter à l'objet de données; la liste sélectionne la cellule, et non pas les données liées.Pour créer le chaînon manquant entre les cellules et la sélection dans la vue liste, nous avons besoin d'un convertisseur (l'idée originale est venue de la Xamarin Forum):
Nous connecter les deux à l'aide de ce convertisseur:
Cette relativement complexe de liaison sert à vérifier réelle de l'élément actuellement sélectionné. Il compare les
SelectedItem
propriété de la vue de liste à laBindingContext
de la vue dans la cellule. Que contexte de liaison est l'objet de données nous fait lier. En d'autres termes, il vérifie si les données de l'objet pointé parSelectedItem
est effectivement l'objet de données dans la cellule. Si elles sont les mêmes, nous avons la cellule sélectionnée. Nous lier ce dans leIsSelected
propriété qui peut ensuite être utilisé dans le code XAML ou code derrière pour voir si le point de vue de la cellule est dans l'état sélectionné.Il y a juste une mise en garde: si vous souhaitez définir une valeur par défaut élément sélectionné lorsque votre page s'affiche, vous devez être un peu habile. Malheureusement, Xamarin Forms a pas de page d'Affiche de l'événement, nous avons seulement à Apparaître et c'est trop tôt pour le réglage de la valeur par défaut: la liaison ne sera pas exécuté ensuite. Donc, utiliser un peu de retard: