0

Je suis en train mis une liste horizontale de certains numéros comme un élément de ListView et je suis fait avec cette belle .. sembleAppliquer TapGestureRecognizer à une étiquette dans la liste horizontale - Formulaires Xamarin

Sample screenshot of horizontal list as item in ListView

ce que je Je veux ensuite quand je fais défiler une liste horizontale d'un élément, je veux que le milieu dans la liste horizontale soit sélectionné automatiquement et je veux que la valeur sélectionnée soit affichée dans l'étiquette de cet élément et en conséquence je veux aussi les autres listes horizontales faire défiler automatiquement et faire la même chose (toutes les valeurs des étiquettes individuelles doivent conserver une différence de leurs valeurs de décalage respectivement).

Ceci est quelque chose de difficile, je sais que le GestureRecognizer aidera ici mais je suis confus où et comment l'implémenter ici, comme je suis nouveau à xamarin .. Je vais écrire tout le code qui donne la capture d'écran ci-dessus ici ..

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

} 

} 

Toute aide serait appréciée .. merci d'avance ..

Répondre

0

Je ne suis pas tout à fait sûr de ce que vous voulez faire ici .. Mais vous devez ajouter le gesturerecognizer à l'étiquette vous générez. Donc, ajoutez-le comme ceci:

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

Espérons que cela vous aide à bien vous entendre.