Как добавить TapGestureRecognizer с c # к созданным элементам из JSON?

поэтому я пытаюсь десериализовать файл JSON и создать из него некоторые элементы, пока все работает хорошо. Моя проблема в том, что я хочу добавить TapGestureRecognizer к каждому созданному элементу, и я не знаю, как это сделать.


    List<Categories> categorie = JsonConvert.DeserializeObject<List<Categories>>(categoriejson);

 Device.BeginInvokeOnMainThread(() =>
    {
  foreach (Categories c in categorie)
    {
       Image image = new Image
      {
       Source = ImageSource.FromUri(new Uri(c.imageUrl))
      };

   image.HeightRequest = 105;
   CategorieLayout.Children.Add(image);

поэтому я просто хочу добавить жест касания к каждому созданному изображению. Я думал о том, чтобы проверить имя x:, присвоенное по умолчанию каждому изображению, но я не смог этого сделать, чтобы ... любые идеи будут очень признательны.


person Shahid Od    schedule 16.10.2019    source источник
comment
Что вы собираетесь делать при касании изображений?   -  person pinedax    schedule 16.10.2019
comment
Я буду десериализовать еще один файл json   -  person Shahid Od    schedule 16.10.2019


Ответы (2)


что-то вроде этого должно работать - я делаю это по памяти, поэтому синтаксис может быть не идеальным

Image image = new Image
{
  Source = ImageSource.FromUri(new Uri(c.imageUrl))
};

var tap = new TappedGestureRecognizer();
tap.Tapped += TappedHandler;
image.GestureRecognizers.Add(tap);
person Jason    schedule 16.10.2019
comment
Окей отлично! а где разместить свои действия при нажатии на картинку? - person Shahid Od; 16.10.2019

Если вы пытаетесь десериализовать файл JSON и создать из него некоторые элементы, я предлагаю вам использовать ScrollView для обертывания содержимого. Вероятно, что одна страница не будет отображаться полностью и потребуется прокрутка. Вы можете сделать следующее:

 public TestPage1()
 {
       StackLayout stackLayout = new StackLayout{};

        ScrollView scroll = new ScrollView();
        scroll.Content = stackLayout;

        foreach (Categories c in categorie) {
            var image = new Image
            {
                Source = ImageSource.FromUri(new Uri(c.imageUrl))

                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.CenterAndExpand,
            };
            var tapGestureRecognizer = new TapGestureRecognizer();
            tapGestureRecognizer.Tapped += Image_OnTapped;
            image.ClassId = c.imageUrl;//attach data to image's `ClassId`
            image.GestureRecognizers.Add(tapGestureRecognizer);


            stackLayout.Children.Add(image);
        }

        Content = scroll;
 }

Метод Image_OnTapped

 private void Image_OnTapped(object sender, EventArgs e)
    {

      // retrieve parameter from sender's ClassId
        var parm = ((Image)sender).ClassId;


    }

Примечание.

Отправителем события Tapped будет элемент управления, к которому прикреплен распознаватель жестов. в вашем случае Image. Вы можете прикрепить свои данные к одному из свойств изображения, чтобы получить к нему доступ из обработчика событий.

 image.ClassId = c.imageUrl;//attach data to image's `ClassId`

И получить значение из метода Image_OnTapped вот так:

var parm = ((Image)sender).ClassId;
person Jessie Zhang -MSFT    schedule 17.10.2019
comment
можно ли узнать, какое изображение прослушивается? так что я могу связать каждый с другим действием? в XAML я использовал x: name - person Shahid Od; 18.10.2019