web-dev-qa-db-fra.com

Comment désactiver la surbrillance sur ListView dans Xamarin.Forms

Je travaille avec Xamarin.Forms et XAML, et j'essaie de créer une application qui stocke une liste de produits. Je mets ma liste de produits dans un ListView. Cela fonctionne bien. Voici mon XAML:

<ListView x:Name="listSushi"
        ItemsSource="{x:Static local:myListSushi.All}"
        SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
        RowHeight="{StaticResource rowHeight}"
        >
<ListView.ItemTemplate>
  <DataTemplate>
    <ViewCell>
      <ViewCell.View>
        <StackLayout Padding="5, 5, 0, 5"
                     Orientation="Horizontal"
                     Spacing="15">
          <StackLayout>
            <Image Source="{Binding ImageSource}" />
          </StackLayout>

          <StackLayout Padding="0, 0, 0, 0"
                       VerticalOptions="Center"
                       HorizontalOptions="FillAndExpand">                
                <Label Text="{Binding Name}"
                   Font="Bold, Medium" />
                <Label Text="{Binding Description}" 
                    Font="Small"/>
          </StackLayout>

          <StackLayout Orientation="Horizontal"
                        Padding="0, 0, 10, 0">
            <Button Text=" - " 
                    HorizontalOptions="EndAndExpand"
                    VerticalOptions="FillAndExpand"
                    Command="{Binding DeleteSushiCommand}"
                    CommandParameter="{Binding Name}"
                    />
            <Label VerticalOptions="Center" 
                   Text="{Binding Number,StringFormat='{0}'}"
                   TextColor="Black"/>
            <Button Text=" + " 
                    HorizontalOptions="EndAndExpand"
                    VerticalOptions="FillAndExpand" 
                    Command="{Binding AddSushiCommand}"
                    CommandParameter="{Binding Name}"
                    />
            </StackLayout>
        </StackLayout>
      </ViewCell.View>
    </ViewCell>
  </DataTemplate>
</ListView.ItemTemplate>

J'ai juste le problème que si je clique sur une cellule de ma liste, la cellule est en surbrillance et reste en surbrillance. J'ai essayé de le désactiver avec ce code dans le xaml.cs

listSushi.ItemSelected+= (object sender, SelectedItemChangedEventArgs e) => {
    // don't do anything if we just de-selected the row
    if (e.SelectedItem == null) return; 
    // do something with e.SelectedItem
    ((ListView)sender).SelectedItem = null; // de-select the row
};

Mais quand je touche une cellule, ma liste défile maintenant automatiquement. C'est très étrange.

Est-ce que quelqu'un sait s'il s'agit d'un bogue ou connaît un correctif, comme s'il y a une propriété où je peux désactiver la surbrillance?

22
dpfauwadel

Vous pouvez essayer d'utiliser l'événement ItemTapped à la place, c'est-à-dire.

listSushi.ItemTapped += (object sender, ItemTappedEventArgs e) => {
    // don't do anything if we just de-selected the row.
    if (e.Item == null) return;

    // Optionally pause a bit to allow the preselect hint.
    Task.Delay(500);

    // Deselect the item.
    if (sender is ListView lv) lv.SelectedItem = null;

    // Do something with the selection.
    ...
};

J'ai testé cela sur un ListView (sur un appareil Android) qui a suffisamment d'éléments pour amener le défilement dans le mix. Je ne vois aucun comportement de défilement automatique, et votre idée de définir la valeur null de SelectedItem pour vaincre le point culminant fonctionne très bien.

45
Mark Larter

Je viens de trouver une autre méthode pour désactiver l'effet de surbrillance. Et je voudrais partager cela avec d'autres utilisateurs.

Vous pouvez le faire directement sur xaml. Mais cette méthode non seulement désactive l'effet de surbrillance, elle désactive également l'événement de clic.

Vous pouvez définir l'attribut IsEnabled de ViewCell sur false.

<ViewCell IsEnabled="false">
    //Your Item Layout Coding
</ViewCell>

De plus, vous pouvez également désactiver/activer chaque effet de surbrillance d'élément en liant:

<ViewCell IsEnabled="{Binding IsHighlightEnabled}">
    //Your Item Layout Coding
</ViewCell>

J'espère que cela aide, merci.

17
Sonny Ng

Actuellement, nous pouvons définir ListView.SelectionMode sur Aucun pour ce faire. https://docs.Microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/interactivity

9
Jesse Jiang
YourList.ItemSelected+=DeselectItem;

 public void DeselectItem(object sender, EventArgs e)
  {
     ((ListView)sender).SelectedItem = null;
  }

Cela devrait être utile pour votre scénario. @dpfauwadel

7
Riyas

Je suppose que vous utilisez MVVM. Dans ces cas, j'attribue un null à la propriété après l'avoir utilisée. Dans votre modèle de vue, vous semblez avoir une propriété SelectedItem puisque vous la liez à la propriété SelectedItem de ListView. Je ferais donc quelque chose comme ceci:

private Product _selectedItem;
public Product SelectedItem
{
  get
  {
    return _selectedItem;
  }
  set
  {
    _selectedItem = value;

    //USE THE VALUE

    _selectedItem = null;
    NotifyPropertyChanged("SelectedItem");
  }
}
6
jgarza

Sur la solution iOS mark ne l'a pas résolu pour moi, j'ai dû créer un CustomRenderer pour la vue de liste et l'utiliser à la place.

NonSelectableListView.cs (dans votre projet Forms)

using System;
using Xamarin.Forms;

namespace YourProject
{
    public class NonSelectableListView : ListView
    {
        public NonSelectableListView()
        {
        }
    }
}

NonSelectableListViewRenderer.cs (CustomRenderer dans votre projet iOS)

using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

using YourProject.iOS;
using YourProject;

[Assembly: ExportRenderer(typeof(NonSelectableListView), typeof(NonSelectableListViewRenderer))]
namespace YourProject.iOS
{
    public class NonSelectableListViewRenderer : ListViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e);

            if (e.OldElement != null)
            {
                // Unsubscribe from event handlers and cleanup any resources
            }

            if (e.NewElement != null)
            {
                // Configure the native control and subscribe to event handlers
                Control.AllowsSelection = false;
            }
        }
    }

}
4
RobVoisey