为什么 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版本更新到最新版本即可。
我有一个按钮和一个网格。按钮绑定到 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版本更新到最新版本即可。