Xaml Xamrin表单:在ListView中滑动以删除(手势)

Xaml Xamrin表单:在ListView中滑动以删除(手势),xaml,xamarin,swipe-gesture,xamarin.forms,Xaml,Xamarin,Swipe Gesture,Xamarin.forms,我想在Xamrin表单中实现刷卡删除功能,为此我尝试了以下方法 为列表视图编写了自定义渲染器,在渲染器的“OnElementChanged”中,我可以访问“CustomListView”的绑定命令,并可以将此命令添加到滑动手势,如下所示 swipeGestureRecognizer = new UISwipeGestureRecognizer (() => { if (command == null) { Console.WriteLine (

我想在Xamrin表单中实现刷卡删除功能,为此我尝试了以下方法

  • 为列表视图编写了自定义渲染器,在渲染器的“OnElementChanged”中,我可以访问“CustomListView”的绑定命令,并可以将此命令添加到滑动手势,如下所示

       swipeGestureRecognizer = new UISwipeGestureRecognizer (() => {
            if (command == null) {
                Console.WriteLine ("No command set");
                return;}
    
            command.Execute (null);
        });
    

  • 但是,我在访问特定行(刷卡行)时遇到问题,因此我可以在列表视图中使刷卡行上的按钮可见/隐藏。请您推荐一种实现相同功能的方法好吗

    您可以这样做:

        protected override void OnElementChanged (ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged (e);
            var swipeDelegate = new SwipeRecogniserDelegate ();
            swipeGestureRecognizer = new UISwipeGestureRecognizer {
                Direction = UISwipeGestureRecognizerDirection.Left,
                Delegate = swipeDelegate
            };
            swipeGestureRecognizer.AddTarget (o => {
                var startPoint = swipeDelegate.GetStartPoint ();
                Console.WriteLine (startPoint);
                var indexPath = this.Control.IndexPathForRowAtPoint(startPoint);
                if(listView.SwipeCommand != null) {
                    listView.SwipeCommand.Execute(indexPath.Row);
                }
            });
            this.Control.AddGestureRecognizer (swipeGestureRecognizer);
            this.listView = (SwipableListView)this.Element;
        }
    

    现在使用ContextAction将滑动删除内置到Xamarin From的列表视图中。下面是如何做的最基本的教程。它很容易实现


    我会将手势添加到ItemTemplate或UITableCell中。你在android上也实现了吗?xamarin表单实现涵盖了最基本的用例。仅供参考:不幸的是,您无法正确使用xamarin表单实现。你还被一些根本无法定制的最基本的菜单项所困扰(例如,为文本选择不同的字体),这意味着你需要立即开始查看自定义渲染器。是的,我发现这方面的文档非常缺乏。
    public class SwipeRecogniserDelegate : UIGestureRecognizerDelegate
    {
        PointF startPoint;
    
        public override bool ShouldReceiveTouch (UIGestureRecognizer recognizer, UITouch touch)
        {
            return true;
        }
    
        public override bool ShouldBegin (UIGestureRecognizer recognizer)
        {
            var swipeGesture = ((UISwipeGestureRecognizer)recognizer);
            this.startPoint = swipeGesture.LocationOfTouch (0, swipeGesture.View);
            return true;
        }
    
        public PointF GetStartPoint ()
        {
            return startPoint;
        }
    }