J'ai une vue de liste et lorsque je clique sur un élément de liste, je veux ouvrir la page de détails de l'élément. Mais quand je clique plus d'un clic rapidement, sa page de navigation ouvre deux. Les const de ma page de détail ont une méthode asynchrone. Voici mon code.
Comment bloquer plusieurs clics?
MyPage.xaml
async void InfiniteListView_ItemSelected(object sender, SelectedItemChangedEventArgs e` { await Navigation.PushAsync(new DetailPage()); }
MyPage.xaml.cs
<ListView HasUnevenRows="True" SeparatorColor="#e7e5e5" IsPullToRefreshEnabled="True" ItemsSource="{Binding ExpecterDemands}" IsRefreshing="{Binding IsBusy, Mode=OneWay}" ItemSelected="InfiniteListView_ItemSelected">
3 Réponses :
Si vous souhaitez éviter les doubles tapotements, vous pouvez ajouter un booléen local pour l'empêcher de s'exécuter plus d'une fois, assurez-vous simplement qu'il est remis à false dans l'instruction finally.
bool _isRunning; async void InfiniteListView_ItemSelected(object sender, SelectedItemChangedEventArgs e { if (_isRunning) return; _isRunning = true; try { await Navigation.PushAsync(new DetailPage()); } finally { _isRunning = false; } }
p >
Une meilleure solution serait d'utiliser ItemTapped
au lieu de ItemSelected
.
ItemSelected
se déclenchera plusieurs fois.
ItemTapped
, d'autre part, ne se déclenche qu'une seule fois lorsque l'élément est touché.
Dans mon cas, je ne peux pas utiliser ItemSelected
et je l'ai corrigé comme ceci pour ItemTapped
Créez une méthode commune StopMultipleTaps
qui désactivera ListView pendant 500 ms, afin qu’un autre clic rapide ne soit pas capturé.
async void InfiniteListView_ItemSelected(object sender, SelectedItemChangedEventArgs e` { StopMultipleTaps((ListView)sender); await Navigation.PushAsync(new DetailPage()); }
Appelez la méthode ci-dessus au tout début du gestionnaire ItemTapped :
public void StopMultipleTaps(ListView listView) { listView.IsEnabled = false; Device.StartTimer(TimeSpan.FromMilliseconds(500), () => { listView.IsEnabled = true; return false; }); }