为啥 Grid 的 TapGesture 识别器在 UWP 的情况下响应缓慢,但在 Android 和 iOS 中运行良好?

Posted

技术标签:

【中文标题】为啥 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?为什么 Grid 的 TapGesture 识别器在 UWP 的情况下响应缓慢,但在 Android 和 iOS 中运行良好? 【发布时间】:2020-10-06 23:33:05 【问题描述】:

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

但在 Grid 的情况下,虽然对于 androidios 这工作得非常好。但是对于 UWP,并不是所有的点击都在执行命令。示例:如果我快速点击网格,比如说 6 次,则相应的标签仅显示 3 或 4 个计数,这意味着用于 tapgesture 的命令执行的次数比实际执行的次数要少。

这就是我的 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>

这里是绑定viewmodel的代码,记录并显示点击次数:

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 中的网格,实际点击次数要少。

【问题讨论】:

我无法重现您的问题。您的项目中 XF 和 UWP 的版本是什么? 有问题的版本:4.6.0.800 IDE:VS 2019 平台目标框架:UWP:18362 当您在网格中快速多次单击时会出现问题。 是的,我点击得很快,但仍然可以正常工作。你可以分享你的样品,这样我就可以直接在我这边测试。 @LucasZhang-MSFT 请从-github.com/SaurabhBohra/GridIssueSample 获取样本,或者您可以使用github.com/SaurabhBohra/GridIssueSample.git 直接克隆它 【参考方案1】:

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

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

【讨论】:

Lucas Zhang - MSFT - 除了更新 Xamarin.Forms 之外,是否还有其他解决方法,因为我提供的示例只是为了演示这个问题,我们有更大的应用程序需要大量努力来更新 Xamarin .Forms 版本,我们计划在未来的某个时间发布。有什么办法可以暂时用 4.6.0.800 版本解决这个问题。

以上是关于为啥 Grid 的 TapGesture 识别器在 UWP 的情况下响应缓慢,但在 Android 和 iOS 中运行良好?的主要内容,如果未能解决你的问题,请参考以下文章

iOS TapGesture 不工作

为啥UILabel TapGesture 只能在标签初始化后工作?

如何在 UIView 中为 UIImageView 添加 tapGesture

使用 tapGesture 自定义 UIView

SwiftUI TapGesture onStart / TouchDown

仅针对特定视图禁用手势识别器