Xamarin распознаватель жестов для пользовательского контроля - PullRequest
0 голосов
/ 06 мая 2018

Я создал пользовательский элемент управления, который содержит изображение. Итак, мне нужно знать, когда пользователь нажимает на изображение. Я попытался добавить TapGestureRecognizer с командой, которая запустила событие. Тем не менее, это не работает. Как я могу это сделать?

public class PhotoViewer: ContentView
{
   public event Action<object> OnImageClicked;

   public PhotoViewer()
   {
       public PhotoViewer()
       {
           StackLayout stackLayout = new StackLayout();

           IList<View> holders = GeneratePhotoHolders(BackgroundImageCount);
           stackLayout.Children.AddRange(holders);

           this.Content = stackLayout;
       }
   }

    private IList<View> GeneratePhotoHolders(int count)
    {
        List<View> holders = new List<View>();

        for (int i = 0; i < count; i++)
        {
            TapGestureRecognizer OneTapRecognizer = new TapGestureRecognizer()
            {
                NumberOfTapsRequired = 1,
                Command = new Command(o => OnImageClicked?.Invoke(o))
            };
            Image image = new Image();
            image.GestureRecognizers.Add(OneTapRecognizer);

            holders.Add(image);
        }

        return holders;
    }
}

Внутри моей главной страницы

photoViewer.OnImageClicked += (o) => Debug.WriteLine("Clicked");

EDITED

Я проверил реализацию событий на обычном ConsoleApp, и он работает нормально. Однако внутри этого пользовательского элемента управления OnImageClicked всегда null

1 Ответ

0 голосов
/ 06 мая 2018

Я не понимаю, чего вы пытаетесь достичь с помощью getter, который возвращает новый экземпляр. Я думаю, что вы хотели инициализировать ваш геттер:

private TapGestureRecognizer OneTapRecognizer { get;} = new TapGestureRecognizer()
      {
         NumberOfTapsRequired = 1,
         Command = new Command<object>(o => OnImageClicked?.Invoke(o))
      };

Кроме того, почему геттер, если переменная является частной?

Я думаю, что вы на самом деле хотите:

public class PhotoViewer: ContentView, IDisposable 
{

       private readonly TapGestureRecognizer _oneTapRecognizer;

       public event Action<object> OnImageClicked;

       public PhotoViewer()
       {
           _oneTapRecognizer = new TapGestureRecognizer()
          {
             NumberOfTapsRequired = 1,
             Command = new Command<object>(o => OnImageClicked?.Invoke(o))
            }
           photoHolder.GestureRecognizers.Add(_oneTapRecognizer);
       }

        public void Didpose()
        {
            photoHolder.GestureRecognizers.Remove(_oneTapRecognizer);
        }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...