Распознаватель жестов Xamarin.Forms - Событие View.GenericMotion может появляться только в левой части + = или - = - PullRequest
0 голосов
/ 21 февраля 2019

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

https://stackoverflow.com/a/41641881/8065149

В целом, я пытаюсь добавить пользовательские жесты в пользовательский рендер карты в Xamarin и Android.Я хочу иметь возможность, при нажатии и удержании, добавить булавку на мою карту.В настоящее время я выяснил, как добавить контакты через кран, но я хочу изменить его на длинный кран.Ниже приведено руководство, которое я использовал, чтобы попытаться добавить жесты в свой проект, поскольку он выглядел многообещающе (хотя его веб-сайт не защищен).А под веб-сайтом также находится проект github на случай, если за ним будет легче следить.

https://arteksoftware.com/gesture-recognizers-with-xamarin-forms/ https://github.com/RobGibbens/XamarinFormsGestureRecognizers

Ниже приведен код, о котором идет речь.В частности, две строки if (this.GenericMotion != null) и if (this.Touch != null).Обе эти строки выдают ошибку: The event 'View.GenericMotion' can only appear on the left hand side of += or -=.

    protected override void OnElementChanged (ElementChangedEventArgs<Label> e)
    {
        base.OnElementChanged (e);

        if (e.NewElement == null) {
            if (this.GenericMotion != null) {
                this.GenericMotion -= HandleGenericMotion;
            }
            if (this.Touch != null) {
                this.Touch -= HandleTouch;
            }
        }

        if (e.OldElement == null) {
            this.GenericMotion += HandleGenericMotion;
            this.Touch += HandleTouch;
        }
    }

    void HandleTouch(object sender, TouchEventArgs e)
    {
        _detector.OnTouchEvent(e.Event);
    }

    void HandleGenericMotion(object sender, GenericMotionEventArgs e)
    {
        _detector.OnTouchEvent(e.Event);
    }

Я попытался последовать ответу, который я отправил ранее, но я был смущен тем, как я должен был проверить, были ли они нулевыми или нет,и затем, если бы они были такими, какими я должен был называть обработчики, которые будут фактически работать с сенсорными событиями.

Если требуется больше кода, чтобы пролить свет на проблему, пожалуйста, оставьте комментарий.Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2019

Ради простоты безопасно удалить обработчик, даже если EventHandler равно null.Поэтому:

this.GenericMotion -= HandleGenericMotion;
this.Touch -= HandleTouch;

безопасно вызывать, даже если GenericMotion и / или Touch равно null.

Обратите внимание, что в то время, когда обработчик удален и повторнодобавлено позже, если событие инициируется, оно не будет обработано .

...