Listview 将TapGestureRecognitor应用于水平列表-Xamarin表单中的标签

Listview 将TapGestureRecognitor应用于水平列表-Xamarin表单中的标签,listview,xamarin.forms,uitapgesturerecognizer,gesture-recognition,horizontallist,Listview,Xamarin.forms,Uitapgesturerecognizer,Gesture Recognition,Horizontallist,我正在尝试将一些数字的水平列表作为ListView的一项,我已经完成了这项工作,看起来很不错 接下来,当我滚动任何项目的水平列表时,我希望自动选择水平列表中的中间一个,我希望选择的值显示在该项目的标签中,相应地,我希望其他水平列表也自动滚动并执行相同的操作(各个标签的所有值应分别保持其偏移值的差异) 这是一件棘手的事情,我知道手势识别器在这里会有所帮助,但我不知道在哪里以及如何实现它,因为我是xamarin的新手。。 我将在这里编写所有代码,将上面的屏幕截图作为输出 namespace Vie

我正在尝试将一些数字的水平列表作为ListView的一项,我已经完成了这项工作,看起来很不错

接下来,当我滚动任何项目的水平列表时,我希望自动选择水平列表中的中间一个,我希望选择的值显示在该项目的标签中,相应地,我希望其他水平列表也自动滚动并执行相同的操作(各个标签的所有值应分别保持其偏移值的差异)

这是一件棘手的事情,我知道手势识别器在这里会有所帮助,但我不知道在哪里以及如何实现它,因为我是xamarin的新手。。 我将在这里编写所有代码,将上面的屏幕截图作为输出

namespace ViewsAndComponents
 {
     class LVItem : INotifyPropertyChanged
     {
    private double _offset;
    private string _num;

    public string Num
    {
        get { return _num; }
        internal set
        {
            _num = value;
            OnPropertyChanged("Num");
        }
    }

    public double Offset
    {
        get { return _offset; }
        internal set
        {
            _offset = value;
            OnPropertyChanged("Offset");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

public partial class SVInsideLVItem : ContentPage
{
    ObservableCollection<LVItem> Items = new ObservableCollection<LVItem>();
    ListView timePlannerLV;

    Label tL;

    public SVInsideLVItem()
    {
        InitializeComponent();

        Items.Add(new LVItem() { Num = "label-1", Offset = 5 });
        Items.Add(new LVItem() { Num = "label-2", Offset = 1 });
        Items.Add(new LVItem() { Num = "label-3", Offset = 3 });
        Items.Add(new LVItem() { Num = "label-4", Offset = 2 });
        Items.Add(new LVItem() { Num = "label-5", Offset = 4 });

        timePlannerLV = new ListView
        {
            // Source of data items.
            ItemsSource = Items,
            HasUnevenRows = true,
            RowHeight = -1,

            //each item; it must return a Cell derivative.)
            ItemTemplate = new DataTemplate(() =>
               {

                   Label numL = new Label()
                   {
                       TextColor = Color.Black,
                       HorizontalTextAlignment = TextAlignment.Start,
                       FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
                   };

                   numL.SetBinding<LVItems>(Label.TextProperty, indexer => indexer.Num);


                   List<int> items = new List<int>();
                   items.Add(1);
                   items.Add(2);
                   items.Add(3);
                   items.Add(4);
                   items.Add(5);
                   items.Add(6);
                   items.Add(7);
                   items.Add(8);
                   items.Add(9);
                   items.Add(10);
                   items.Add(11);
                   items.Add(12);
                   items.Add(13);
                   items.Add(14);
                   items.Add(15);
                   items.Add(16);
                   items.Add(17);
                   items.Add(18);
                   items.Add(19);
                   items.Add(20);

                   StackLayout sLayout = new StackLayout()
                   {
                       Orientation = StackOrientation.Horizontal,

                   };

                   for (int i = 0; i < items.Count; i++)
                   {
                       Label label = new Label()
                       {
                           HorizontalTextAlignment = TextAlignment.Center,
                           TextColor = Color.Black,
                           FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
                       };

                       label.Text = items[i].ToString();

                       sLayout.Children.Add(label);
                   }

                   ScrollView scroll = new ScrollView
                   {
                       Orientation = ScrollOrientation.Horizontal,
                       Content = new StackLayout
                       {
                           Children =
                         {
                            sLayout
                           }

                       }
                   };

                   AbsoluteLayout layout = new AbsoluteLayout();
                   AbsoluteLayout.SetLayoutFlags(numL, AbsoluteLayoutFlags.All);
                   AbsoluteLayout.SetLayoutBounds(numL, new Rectangle(0.2, 0.2, 0.8, 0.25));

                   AbsoluteLayout.SetLayoutFlags(scroll, AbsoluteLayoutFlags.All);
                   AbsoluteLayout.SetLayoutBounds(scroll, new Rectangle(0.3, 0.6, 0.8, 0.2));


                   layout.Children.Add(numL);
                   layout.Children.Add(scroll);

                   return new ViewCell
                   {
                       View = new StackLayout
                       {
                           Children =
                        {
                            layout,
                            new BoxView{HeightRequest=1,BackgroundColor=Color.Gray}
                        }

                       }
                   };
               })
        };

        this.Content = new StackLayout
        {
            Children =
            {
                    timePlannerLV
            }
        };
    }

}

 }
命名空间视图和组件
{
LVItem类:INotifyPropertyChanged
{
私人双U补偿;
私有字符串_num;
公共字符串数
{
获取{return\u num;}
内部集
{
_num=值;
OnPropertyChanged(“Num”);
}
}
公共双偏移
{
获取{return\u offset;}
内部集
{
_偏移量=值;
不动产变更(“抵销”);
}
}
公共事件属性更改事件处理程序属性更改;
受保护的虚拟void OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共分部类SVINDELVITEM:ContentPage
{
ObservableCollection Items=新的ObservableCollection();
ListView timePlannerLV;
标签tL;
公共项目
{
初始化组件();
添加(新的LVItem(){Num=“label-1”,偏移量=5});
添加(新的LVItem(){Num=“label-2”,Offset=1});
添加(新的LVItem(){Num=“label-3”,Offset=3});
添加(新的LVItem(){Num=“label-4”,Offset=2});
添加(新的LVItem(){Num=“label-5”,Offset=4});
timePlannerLV=新建列表视图
{
//数据项的来源。
ItemsSource=项目,
HasRows=true,
行高=-1,
//每个项目;它必须返回一个单元格导数。)
ItemTemplate=新数据模板(()=>
{
Label numL=新标签()
{
TextColor=Color.Black,
HorizontalTextAlignment=TextAlignment.Start,
FontSize=Device.GetNamedSize(NamedSize.Small,新标签())
};
SetBinding(Label.TextProperty,indexer=>indexer.Num);
列表项=新列表();
增加第(1)项;
增加(2)项;
增加(3)项;
增加第(4)项;
增加第(5)项;
增加第(6)项;
增加(7)项;
增加(8)项;
增加(9)项;
增加(10);
增加(11)项;
增加(12);
增加(13);
增加(14);
增加(15);
增加(16);
增加(17);
增加(18);
增加(19);
增加(20);
StackLayout sLayout=新的StackLayout()
{
方向=堆叠方向。水平,
};
对于(int i=0;i

任何帮助都将不胜感激。。提前谢谢..

我不完全确定你想在这里做什么。。但您需要将手势识别器添加到生成的标签中。因此,添加如下内容:

Label label = new Label()
{
    HorizontalTextAlignment = TextAlignment.Center,
    TextColor = Color.Black,
    FontSize = Device.GetNamedSize(NamedSize.Small, new Label())
};

label.Text = items[i].ToString();

var gestureRecognizer = new TapGestureRecognizer {
    TappedCallback = o => selectedLabel.Text = o,
    NumberOfTapsRequired = 1
};

label.GestureRecognizers.Add (gestureRecognizer);

sLayout.Children.Add(label);
希望这能帮助你相处