Хобрук: Ваш путь к мастерству в программировании

Изображение — долгий тап

Есть ли способ обнаружить долгое касание элемента управления изображением в Xamarin Forms?

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


  • Посетите этот форум, решение XLabs должно хорошо работать: forums.xamarin.com/discussion/27323/ 26.03.2017
  • вам нужно либо использовать пользовательский рендерер, чтобы обнаружить его на уровне платформы, либо сторонний пакет, такой как MRGestures. Текущий набор встроенных жестов не включает долгое касание. 26.03.2017

Ответы:


1

Основываясь на ваших предложениях в комментариях, я сделал следующее: (Цель элемента управления - иметь возможность выбрать изображение с помощью LongTap)

Я определил свой собственный элемент управления Image в PCL:

  • IsSelected BindableProperty.
  • Событие LongTap.

     public class MyImage:Image
    {
            private BindableProperty IsSelectedProperty = BindableProperty.Create("IsSelected", typeof(bool), typeof(MyImage), false);
    
        public bool IsSelected {
            get {
                return (bool)GetValue(IsSelectedProperty);
            }
            set {
                SetValue(IsSelectedProperty, value);
            }
        }
    
    
        public event EventHandler LongClick;
    
        public void OnLongClick()
        {
            IsSelected = !IsSelected;
    
            if(IsSelected)
            {
                Opacity = 0.5;
            }
            else
            {
                Opacity = 1;
            }
    
            if (LongClick != null)
            {
                LongClick(this, EventArgs.Empty);
            }
        }
    }
    

И это мой пользовательский рендерер: (определено в проекте Android)

[assembly: ExportRenderer(typeof(MyImage), typeof(MyImageRenderer))]
namespace PRISMCarouselView.Droid.Renderes
{
    public class MyImageRenderer : ImageRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                ImageView androidSource = Control as ImageView;
                MyImage myImage = e.NewElement as MyImage;

                androidSource.LongClick += (object sender, LongClickEventArgs ee) =>
                {
                    myImage.OnLongClick();
                };
            }
        }
    }
}

Редактировать 1:

Вот немного обновленная версия, я использую BindingPropertyChangedDelegate для изменения непрозрачности изображения:

 public class SelectableImage : Image
    {
        public SelectableImage()
        {

        }

        private static BindableProperty IsSelectedProperty = BindableProperty.Create("IsSelected",
        typeof(bool),
        typeof(SelectableImage),
        false, BindingMode.Default, null, (sender, o1, o2) => {

            SelectableImage imageControl = sender as SelectableImage;
            if(imageControl != null)
            {
                if(imageControl.IsSelected)
                {
                    imageControl.Opacity = 0.5;
                }else
                {
                    imageControl.Opacity = 1;
                }
            }
        });

        public bool IsSelected {
            get {
                return (bool)GetValue(IsSelectedProperty);
            }
            set {
                SetValue(IsSelectedProperty, value);
            }
        }


    }

И рендерер:

[assembly: ExportRenderer(typeof(SelectableImage), typeof(SelectableImageRenderer))]
namespace Muserma.Apps.Droid.Renderer
{
    public class SelectableImageRenderer : ImageRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
        {
            base.OnElementChanged(e);

            if (Control != null)
            {
                ImageView androidSource = Control as ImageView;
                SelectableImage selectableImage = e.NewElement as SelectableImage;

                androidSource.LongClick += (object sender, LongClickEventArgs ee) =>
                {
                    selectableImage.IsSelected = !selectableImage.IsSelected;
                };
            }
        }

    }
}
27.03.2017
Новые материалы

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

стройный-i18следующий
Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..