Xamarin Forms Listview ItemSelected NavigationPage两次

时间:2019-01-24 20:50:45

标签: xamarin xamarin.forms

我有一个列表视图,当单击列表项时,我想打开项目详细信息页面。但是当我不止一击时,它会打开两个导航页面。我的详细信息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());
    }

3 个答案:

答案 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());
    }