xamarin/Xamarin.Forms

[Bug][iOS] TapGestureRecognizer overrides CollectionView touch events. (iOS)

開放

#8,711 建立於 2019年11月28日

 (7 則留言) (1 個反應) (0 位負責人)C# (1,926 個分叉)batch import
a/collectionviewa/gestures 🖖e/3 :clock3:help wantedinactivem/high impact :black_large_square:p/iOS 🍎partner/cat 😻t/bug :bug:up-for-grabs

倉庫指標

星標
 (5,644 顆星)
PR 合併指標
 (30 天內沒有已合併 PR)

描述

###Description If a parent view has a TabGestureRecognizer then the CollectionView touch events aren't fired. For example both the SelectionChangeCommand isn't fired nor is the SelectedItem updated. Also this could be any parent view in the chain of views, doesn't have to be a direct parent as it seems views pass TabGestureRecognizer event along to children

Steps to Reproduce

View

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="SelectionChangeIssue.MainPage">
    <StackLayout BackgroundColor="Green">
        <StackLayout.GestureRecognizers>
            <TapGestureRecognizer Command="{Binding StackTappedCommand}"/>
        </StackLayout.GestureRecognizers>

        <StackLayout InputTransparent="False" Margin="20" Padding="80" BackgroundColor="Red">
            <CollectionView ItemsSource="{Binding TestItems}" 
                            SelectionMode="Single" 
                            SelectionChangedCommand="{Binding SelectionChangedCommand}" 
                            SelectedItem="{Binding SelectedTestItem}" 
                            BackgroundColor="LightSteelBlue">
                <CollectionView.ItemsLayout>
                    <ListItemsLayout Orientation="Vertical" ItemSpacing="3"/>
                </CollectionView.ItemsLayout>
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Label BackgroundColor="Green" 
                               TextColor="White" 
                               Text="{Binding .}" 
                               HeightRequest="40" 
                               HorizontalTextAlignment="Center" 
                               VerticalTextAlignment="Center"/>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
           
        </StackLayout>
    </StackLayout>
</ContentPage>

ViewModel

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Text;
using System.Windows.Input;
using Xamarin.Forms;

namespace SelectionChangeIssue
{
    public class MainPage_ViewModel : INotifyPropertyChanged
    {
        public MainPage_ViewModel()
        {
            SelectionChangedCommand = new Command(async () => await Application.Current.MainPage.DisplayAlert("CollectionView", "CollectionView Selection Changed to " + SelectedTestItem, "OK"));
            StackTappedCommand = new Command(async () => await Application.Current.MainPage.DisplayAlert("StackLayout", "StackLayout Tapped", "OK"));

            TestItems = new ObservableCollection<string>
            {
                "Item 1",
                "Item 2",
                "Item 3",
                "Item 4",
                "Item 5",
                "Item 6",
                "Item 7",
                "Item 8",
                "Item 9",
                "Item 10"
            };
        }

        private ObservableCollection<string> _testItems;
        public ObservableCollection<string> TestItems
        {
            get { return _testItems; }
            set
            {
                if (_testItems != value)
                {
                    _testItems = value;
                    OnPropertyChanged(nameof(TestItems));
                }
            }
        }

        private string _selectedTestItem;
        public string SelectedTestItem
        {
            get { return _selectedTestItem; }
            set
            {
                if (_selectedTestItem != value)
                {
                    _selectedTestItem = value;
                    OnPropertyChanged(nameof(SelectedTestItem));
                }
            }
        }



        public ICommand SelectionChangedCommand { get; protected set; }
        public ICommand StackTappedCommand { get; protected set; }


        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            var changed = PropertyChanged;
            if (changed != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

Expected Behavior

The touching a Cell on the CollectionView should select an item and run the attached command.

Actual Behavior

the TapGestureRecognizer is raised instead of the CollectionView events

Basic Information

  • Version with issue: Xamarin.Forms 4.3.0
  • Platform Target Frameworks:
    • iOS: v4.0.30319

貢獻者指南