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;
});
}