我有一个列表视图,当单击列表项时,我想打开项目详细信息页面。但是当我不止一击时,它会打开两个导航页面。我的详细信息Page的const有一个异步方法。 这是我的代码。
如何阻止多次点击?
MyPage.xaml
<ListView
HasUnevenRows="True"
SeparatorColor="#e7e5e5"
IsPullToRefreshEnabled="True"
ItemsSource="{Binding ExpecterDemands}"
IsRefreshing="{Binding IsBusy, Mode=OneWay}"
ItemSelected="InfiniteListView_ItemSelected">
MyPage.xaml.cs
async void InfiniteListView_ItemSelected(object sender, SelectedItemChangedEventArgs e`
{
await Navigation.PushAsync(new DetailPage());
}
答案 0 :(得分:2)
如果要防止双击,可以添加一个本地bool以防止其多次运行,只需确保在finally语句中将其设置为false。
bool _isRunning;
async void InfiniteListView_ItemSelected(object sender, SelectedItemChangedEventArgs e
{
if (_isRunning)
return;
_isRunning = true;
try
{
await Navigation.PushAsync(new DetailPage());
}
finally
{
_isRunning = false;
}
}
答案 1 :(得分:1)
更好的解决方案是使用ItemTapped
而不是ItemSelected
。
ItemSelected
将触发多次。
ItemTapped
仅在点击该项目时触发一次。
答案 2 :(得分:0)
在我的情况下,我无法使用ItemSelected
,并且为ItemTapped
这样修复了它
创建一个通用方法StopMultipleTaps
,该方法将在500毫秒内禁用ListView,以便不会捕获另一个快速单击。
public void StopMultipleTaps(ListView listView)
{
listView.IsEnabled = false;
Device.StartTimer(TimeSpan.FromMilliseconds(500), () => {
listView.IsEnabled = true;
return false;
});
}
在ItemTapped处理程序的最开始处调用上述方法:
async void InfiniteListView_ItemSelected(object sender, SelectedItemChangedEventArgs e`
{
StopMultipleTaps((ListView)sender);
await Navigation.PushAsync(new DetailPage());
}