0

我试图把一些数字的水平列表为ListView控件的一个项目,我做了,看起来不错..应用TapGestureRecognizer在水平列表中的标签 - Xamarin窗体

Sample screenshot of horizontal list as item in ListView

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

这是些棘手的问题,我知道GestureRecognizer在这里会有所帮助,但我很困惑在这里,以及如何在这里实现它,因为我是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 
      } 
     }; 
    } 

} 

} 

任何帮助,将不胜感激。在此先感谢..

回答

0

我不能完全确定要在这里做什么。但你需要的gesturerecognizer添加到标签你生成。所以,像这样添加它:

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); 

希望这可以帮助你相处。