Xamarin中CollectionView的GestureRecognizers无法触发该如何解决?
CollectionView任意区域点击触发命令的问题解决
问题描述
我有一个CollectionView,希望用户点击该控件的任意区域(无论是否选中项、甚至没有项时)都能执行指定命令,但设置的TapGestureRecognizer始终无法触发。相同的手势代码在其他控件上可正常工作,推测是手势被传递给了子项。请问是需要将CollectionView包裹在其他控件中,还是有CollectionView的属性可解决此问题?
原代码
<CollectionView x:Name="addedContactCollection" BackgroundColor="AliceBlue" ItemsSource="{Binding RecentComments}" SelectionMode="None"> <CollectionView.GestureRecognizers> <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding CollectionTapped}"> </TapGestureRecognizer> </CollectionView.GestureRecognizers>
解决办法
方法一:通过子项属性拦截手势传递
如果是CollectionView的子项拦截了手势,可以给ItemTemplate的根控件设置InputTransparent="True",让子项不处理手势,将手势传递给父级的CollectionView。注意这个方法会让子项自身的交互功能失效,适合子项不需要单独交互的场景。
示例ItemTemplate修改:
<CollectionView.ItemTemplate> <DataTemplate> <Grid InputTransparent="True"> <!-- 子项原有内容 --> </Grid> </DataTemplate> </CollectionView.ItemTemplate>
方法二:用布局控件包裹CollectionView(通用方案)
如果需要保留子项的交互,或者要确保空区域也能触发手势,最稳妥的方式是把CollectionView放在Grid或ContentView这类布局控件里,将TapGestureRecognizer添加到外层控件上:
<Grid BackgroundColor="AliceBlue"> <CollectionView x:Name="addedContactCollection" ItemsSource="{Binding RecentComments}" SelectionMode="None"> <!-- CollectionView原有配置及内容 --> </CollectionView> <Grid.GestureRecognizers> <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding CollectionTapped}" /> </Grid.GestureRecognizers> </Grid>
这种方式下,整个Grid覆盖的区域都会响应点击,不管CollectionView有没有子项,同时不会影响子项自身的交互逻辑(子项的点击事件仍能正常触发)。
原因说明
CollectionView自带的手势不生效,主要是两个原因:一是子项控件会优先捕获并处理点击手势;二是当没有子项时,CollectionView的空白区域可能没有被可点击的元素覆盖,导致手势无法被捕获。外层包裹布局控件的方式能同时解决这两个问题。
内容的提问来源于stack exchange,提问作者noone392
相关产品推荐
相关产品推荐

