为什么 Grid 的 TapGesture 识别器在 UWP 的情况下响应缓慢但在 Android 和 iOS 中工作正常?

Why TapGesture recognizer for Grid is slow to respond in case of UWP but works fine in Android and iOS?

我有一个按钮和一个网格。按钮绑定到 ExecuteButtonCommand,Grid 的 TapGestureRecognizer 绑定到 ExecuteGridCommand。现在,如果我快速快速地按下按钮,相应的标签会显示所有平台的正确点击次数,即命令代码的执行次数为点击发生的次数。

但是对于 Grid,尽管对于 android 和 iOS 这工作得很好。但是对于UWP,并不是所有的点击都是在执行命令。示例:如果我快速敲击网格,比如说 6 次,那么相应的标签仅显示 3 或 4 次计数,这意味着敲击命令的执行次数少于实际应执行的次数。

这是我的 ViewModel

<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
        <!-- Place new controls here -->
        <Label Text="{Binding ButtonExecutionCount}" HorizontalOptions="Center"/>
        <Button x:Name="ClickButton" Text="ExecuteClick"  HorizontalOptions="Center"
                    Command="{Binding ExecuteButtonCommand}"
                />
        <Label Text="{Binding GridExecutionCount}" HorizontalOptions="Center"/>
        <Grid BackgroundColor="Aquamarine" VerticalOptions="Center" HorizontalOptions="Center">
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Label Text="Click this grid" Grid.Column="0" Grid.Row="0" HorizontalOptions="Center"/>
            <Grid.GestureRecognizers>
                <TapGestureRecognizer Command="{Binding ExecuteGridCommand}"></TapGestureRecognizer>
            </Grid.GestureRecognizers>
        </Grid>
    </StackLayout>

这里是绑定视图模型的代码,记录和显示点击次数:

public class MainPageViewModel : INotifyPropertyChanged
    {
        public MainPageViewModel()
        {
            ExecuteGridCommand = new Command(ExecuteGridMethod);
            ExecuteButtonCommand = new Command(ExecuteButtonMethod);
        }

        private int _gridExecutionCount;
        public int GridExecutionCount
        {
            get => _gridExecutionCount;
            set
            {
                _gridExecutionCount = value;
                OnPropertyChanged();
            }
        }

        private int _buttonExecutionCount;
        public int ButtonExecutionCount
        {
            get => _buttonExecutionCount;
            set
            {
                _buttonExecutionCount = value;
                OnPropertyChanged();
            }
        }

        public Command ExecuteGridCommand { get; set; }

        public Command ExecuteButtonCommand { get; set; }


        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string name = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
        }

        public void ExecuteGridMethod()
        {
            GridExecutionCount++;
        }

        public void ExecuteButtonMethod()
        {
            ButtonExecutionCount++;
        }
    }

这里我点击了 5 次,按钮计数很好,但对于 UWP 中的网格,实际点击次数要少。

原因: 您项目中的奇怪行为是由 Xamarin.Forms 的版本引起的。这是版本 4.5.x 中存在的问题。

解决方法:该问题已在最新版本(4.7.x)中修复。我在上面测试了你的样品并且工作正常。所以你只需要将共享项目和平台项目中的XF版本更新到最新版本即可。