为啥 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 的情况下,虽然对于 android 和 ios 这工作得非常好。但是对于 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 中运行良好?的主要内容,如果未能解决你的问题,请参考以下文章
为啥UILabel TapGesture 只能在标签初始化后工作?
如何在 UIView 中为 UIImageView 添加 tapGesture