(J'ai demandé sur le forums Xamarin mais je n'ai pas eu de réponse, alors j'essaie ici))}
Dans Xamarin Forms, la définition de BackgroundColor
dans un ListView ItemTemplate
entraîne la désactivation du retour haptique .
Y a-t-il un moyen de contourner cela? J'aimerais personnaliser les couleurs de mes éléments de liste, mais le fait de ne pas avoir de retour haptique ressemble à une foutaise.
Exemple XAML:
<ListView x:Name="list"
ItemTapped="OnItemSelected"
IsGroupingEnabled="True"
GroupDisplayBinding="{Binding Key}"
GroupShortNameBinding="{Binding Key}"
HasUnevenRows="True"
ItemsSource="{Binding .}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout VerticalOptions="FillAndExpand"
Padding="5, 20"
BackgroundColor="#CCCCCC"> <!--This line causes haptic feedback to fail -->
<Label Text="{Binding Name}"
TextColor="Black"
VerticalOptions="Center"
FontSize="Large"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Le plus proche que j'ai eu est de changer la BackgroundColor
dans ViewCell.Tapped
, puis de la remettre dans View.OnAppearing()
(ViewCell.Appearing
est cassé)}, mais _, mais change l'arrière-plan lorsque le doigt est levé, plutôt que lorsqu'il est appuyé.
Je teste sur Android mais préférerais une solution multi-plateforme.
Vérifiez votre message sur le forum Xamarin pour mes commentaires. XFGloss est une solution d’arrivée facile pour vous. C'est un add-on open source gratuit pour Xamarin.Forms. La source est disponible sur GitHub . Il existe également un package NuGet available. Il vous permet d'attribuer une valeur BackgroundColor aux contrôles de cellule XF standard (TextCell, EntryCell, etc.). Plusieurs nouvelles propriétés ont également été ajoutées par XFGloss.
Si vous préférez corriger votre implémentation existante, vous pouvez consulter les modifications apportées pour prendre en charge le retour visuel de ce code commit .
Une fois la couleur d'arrière-plan définie, vous ne pourrez plus voir la couleur de l'élément sélectionné ni le retour d'information Haptic, à moins que vous ne créiez un rendu personnalisé sur chaque plate-forme.
Voici le travail que vous pouvez mettre en œuvre entre plates-formes et sur MVVM à l'aide de Liaisons pour définir la couleur de l'élément sélectionné:
SelectedItem
de ListView
. StackLayout
à une propriété auto et définissez la valeur "#CCCCCC" si l'élément n'est pas sélectionné, sinon une autre couleur. MyItem
et appeler la propriété OnPropertyChanged
de la propriété BackgroundColor. Pour cela, vous pouvez créer un événement et vous abonner, ou tout autre élément avec lequel vous vous sentez à l'aise .(ceci n'est pas implémenté dans le pseudo-code exemple fourni ci-dessous)} ViewModel:
public class MyViewModel : IMyViewModel
{
public ObserveableCollection<MyItem> Items { get; set; }
public MyItem SelectedMyItem { get; set; }
}
Classe d'élément de liste:
public class MyItem
{
private readonly IMyViewModel _myViewModel;
public MyItem(IMyViewModel myViewModel)
{
_myViewModel = myViewModel;
}
public string Name { get; set; }
public Color BackgroundColor => _myViewModel.SelectedMyItem == this
? Color.Red : Color.FromHex("CCCCCC");
}
XAML:
<ListView x:Name="list"
IsGroupingEnabled="True"
GroupDisplayBinding="{Binding Key}"
GroupShortNameBinding="{Binding Key}"
HasUnevenRows="True"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedMyItem}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout VerticalOptions="FillAndExpand"
Padding="5, 20"
BackgroundColor="{Binding BackgroundColor}">
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Tapped="OnItemTapped" />
</StackLayout.GestureRecognizers>
<Label Text="{Binding Name}"
TextColor="Black"
VerticalOptions="Center"
FontSize="Large"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Les retours haptiques contournent:
Habituellement, une touche est 200-300ms. Une fois que vous avez appuyé sur un élément, vous pouvez modifier la couleur de l'arrière-plan pour cette durée, puis définir la couleur d'origine.
public async void OnItemTapped(object sender, EventArgs args)
{
BackgroundColor = Color.Orange; //touch color
await Task.Delay(250); //time to show new color
BackgroundColor = Color.Red; //original color
}
Vous pouvez même améliorer cela davantage en essayant d'incorporer animations , peut-être le FadeTo pour changer les couleurs.
Vous pouvez simplement l'utiliser dans votre classe héritée Viewcell ,
this.Tapped += ViewCell_Tapped;
// En tapotant dans votre cellule de vue, vous pouvez obtenir un résultat haptique.
async privé void ViewCell_Tapped (expéditeur d'objet, EventArgs e) { this.View.BackgroundColor = Color.Gray; wait Task.Delay (10);
this.View.BackgroundColor = Color.White; }
Cela fonctionne pour moi.