C# Xamarin UISweepGestureRecognitor渲染器

C# Xamarin UISweepGestureRecognitor渲染器,c#,xamarin.ios,uigesturerecognizer,xamarin.forms,C#,Xamarin.ios,Uigesturerecognizer,Xamarin.forms,在Xamarin.Forms中,我希望能够左右滑动以浏览图片列表。目前,我只想在每次检测到刷卡时触发一个事件 要在渲染器中使用的子类: public class LRMasterDetailPage : ContentView { } 我有一个使用LRM类的ContentPage,如下所示: public class ImagePage : ContentPage { public ImagePage(Photo photo) {

在Xamarin.Forms中,我希望能够左右滑动以浏览图片列表。目前,我只想在每次检测到刷卡时触发一个事件

要在渲染器中使用的子类:

public class LRMasterDetailPage : ContentView
{
}
我有一个使用LRM类的ContentPage,如下所示:

    public class ImagePage : ContentPage 
    {

    public ImagePage(Photo photo)
        {
            _image = new WebImage
                {
                    Url = photo.Url,
                    Placeholder = "placeHolder2.png"
                };

            var imageView = new LRMasterDetailPage {
                Content = _image
            };

            this.Content = imageView;
           }
      }
这是我的渲染器:

    [assembly:ExportRenderer (typeof(LRMasterDetailPage), typeof(LRMDPRenderer))]
namespace Project.iOS
{
    public class LRMDPRenderer : ViewRenderer<LRMasterDetailPage,UIView>
    {
        UISwipeGestureRecognizer swipe;

        protected override void OnElementChanged (ElementChangedEventArgs<LRMasterDetailPage> e)
        {
            base.OnElementChanged (e);
            // Do someting else, init for example
            swipe = new UISwipeGestureRecognizer();
            this.AddGestureRecognizer (swipe);

            if (swipe.Direction == UISwipeGestureRecognizerDirection.Left) 
            {
                UpdateLeft ();
            }

            if (swipe.Direction == UISwipeGestureRecognizerDirection.Right) 
            {
                UpdateRight ();
            }
        }

        protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Renderer")
                return;
            base.OnElementPropertyChanged (sender, e);

        }

        private void UpdateLeft(){
            // Insert view of DetailLeft element into subview
            // Add button to open Detail to parent navbar, if not yet there
            // Add gesture recognizer for left swipe
            Console.WriteLine ("Left swipe");

        }
        private void UpdateRight(){
            // same as for left, but flipped
            Console.WriteLine ("Right swipe");

        }
    }
}
[程序集:导出呈现程序(typeof(LRMasterDetailPage)、typeof(LRMDPRenderer))]
命名空间Project.iOS
{
公共类LRMDPRenderer:ViewRenderer
{
UISweepGestureRecognitor刷卡;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
碱基。一个元素改变(e);
//做些别的事情,比如初始化
滑动=新的UISweepGestureRecognizer();
此.AddGestureRecognitor(滑动);
if(swipe.Direction==uiswipgesturerecognizerdirection.Left)
{
UpdateLeft();
}
if(swipe.Direction==UISWipgestureRecognitizerDirection.Right)
{
UpdateRight();
}
}
受保护的覆盖无效OneElementPropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
如果(例如,PropertyName==“渲染器”)
返回;
base.OnElementPropertyChanged(发送方,e);
}
私有void UpdateLeft(){
//将DetailLeft元素的视图插入子视图
//添加按钮以打开父导航栏的详细信息(如果还没有)
//为左扫添加手势识别器
Console.WriteLine(“左扫”);
}
私有void UpdateRight(){
//与左侧相同,但已翻转
Console.WriteLine(“右击”);
}
}
}

当ContentPage显示时,右键滑动事件被激活,但当我尝试在图像顶部滑动时,什么也没有发生。我猜我在渲染器上的逻辑是错误的?

在经历了很多痛苦并在网上搜索之后,我找到了解决方案

您需要做的很简单:在渲染器中声明并添加手势。通过声明左右两侧的方向,确保为它们创建一个滑动手势。从那里,使用lambda调用要为特定刷卡激活的函数:

用于滑动手势的占位符类

public class LRMasterDetailPage : ContentView
    {

    }
一次保存一个图像的图像页面

public class ImagePage : ContentPage
{

    //view holding the image
    LRMasterDetailPage imageView;

    //collection of images using the photo.Url
    ObservableCollection<Image> images;

    //current image index
    int index = 0;

public ImagePage(){

       images = new ObservableCollection<Image> ();
       imageView = new LRMasterDetailPage {
            Content = this.images [index]
        };

        this.Content = imageView;
}

 //Subscribe to the swipeLeft and swipeRight message
  protected override void OnAppearing ()
    {
        base.OnAppearing ();

        MessagingCenter.Subscribe <string> (this,"LeftSwipe", (sender) => {

            //Do something
            if(index < images.Count-1){
                index++;
            }

            imageView.Content = this.images[index];


        });
        MessagingCenter.Subscribe <string> (this, "RightSwipe", (sender) => {

            //Do something
            if(index > 0){
                index--;
            }

            imageView.Content = this.images[index];


        });
   }

     protected override void OnDisappearing()
    {
        base.OnDisappearing();

        //this._image = null;

        images = null;

        MessagingCenter.Unsubscribe<string>(this,"LeftSwipe");
        MessagingCenter.Unsubscribe<string>(this, "RightSwipe");
        MessagingCenter.Unsubscribe<string>(this, "LongPress");

        //GC.Collect();
    }

}
公共类ImagePage:ContentPage
{
//持有图像的视图
LRMasterDetailPage图像视图;
//使用photo.Url收集图像
可观测采集图像;
//当前图像索引
int指数=0;
公共图像页(){
图像=新的可观察集合();
imageView=新的LRMasterDetailPage{
Content=this.images[index]
};
this.Content=imageView;
}
//订阅swipeLeft和swipeRight消息
出现时受保护的覆盖无效()
{
base.OnAppearing();
MessagingCenter.Subscribe(此为“左滑动”),(发件人)=>{
//做点什么
如果(索引{
//做点什么
如果(索引>0){
索引--;
}
imageView.Content=this.images[index];
});
}
受保护的覆盖无效OnDisappearing()
{
base.OnDisappearing();
//这个。_image=null;
图像=空;
取消订阅(这是“左击”);
取消订阅(这是“右击”);
取消订阅(此为“LongPress”);
//GC.Collect();
}
}
LRMasterDetailPage的渲染器

    [assembly:ExportRenderer (typeof(LRMasterDetailPage), typeof(LRMDPRenderer))]
namespace Manager.iOS
{
    public class LRMDPRenderer : ViewRenderer<LRMasterDetailPage,UIView>
    {

        UILongPressGestureRecognizer longPressGestureRecognizer;
        UIPinchGestureRecognizer pinchGestureRecognizer;
        //UIPanGestureRecognizer panGestureRecognizer;
        UISwipeGestureRecognizer swipeRightGestureRecognizer;
        UISwipeGestureRecognizer swipeLeftGestureRecognizer;
        UIRotationGestureRecognizer rotationGestureRecognizer;

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

            longPressGestureRecognizer = new UILongPressGestureRecognizer (() => Console.WriteLine ("Long Press"));
            pinchGestureRecognizer = new UIPinchGestureRecognizer (() => Console.WriteLine ("Pinch"));
            //panGestureRecognizer = new UIPanGestureRecognizer (() => Console.WriteLine ("Pan"));

            swipeRightGestureRecognizer = new UISwipeGestureRecognizer ( () => UpdateRight()){Direction = UISwipeGestureRecognizerDirection.Right};
            swipeLeftGestureRecognizer = new UISwipeGestureRecognizer ( () => UpdateLeft()){Direction = UISwipeGestureRecognizerDirection.Left};
            rotationGestureRecognizer = new UIRotationGestureRecognizer (() => Console.WriteLine ("Rotation"));

            if (e.NewElement == null) {
                if (longPressGestureRecognizer != null) {
                    this.RemoveGestureRecognizer (longPressGestureRecognizer);
                }
                if (pinchGestureRecognizer != null) {
                    this.RemoveGestureRecognizer (pinchGestureRecognizer);
                }

                /*
                if (panGestureRecognizer != null) {
                    this.RemoveGestureRecognizer (panGestureRecognizer);
                }
                */

                if (swipeRightGestureRecognizer != null) {
                    this.RemoveGestureRecognizer (swipeRightGestureRecognizer);
                }
                if (swipeLeftGestureRecognizer != null) {
                    this.RemoveGestureRecognizer (swipeLeftGestureRecognizer);
                }

                if (rotationGestureRecognizer != null) {
                    this.RemoveGestureRecognizer (rotationGestureRecognizer);
                }
            }

            if (e.OldElement == null) {
                this.AddGestureRecognizer (longPressGestureRecognizer);
                this.AddGestureRecognizer (pinchGestureRecognizer);
                //this.AddGestureRecognizer (panGestureRecognizer);
                this.AddGestureRecognizer (swipeRightGestureRecognizer);
                this.AddGestureRecognizer (swipeLeftGestureRecognizer);
                this.AddGestureRecognizer (rotationGestureRecognizer);
            }
        }

        private void UpdateLeft(){
            MessagingCenter.Send ("Swiped to the left", "LeftSwipe");

        }
        private void UpdateRight(){
            // same as for left, but flipped
            MessagingCenter.Send ("Swiped to the Right", "RightSwipe");

        }
    }
}
[程序集:导出呈现程序(typeof(LRMasterDetailPage)、typeof(LRMDPRenderer))]
命名空间管理器.iOS
{
公共类LRMDPRenderer:ViewRenderer
{
UILongPressGestureRecognitor LongPressGestureRecognitor;
UIPinchGestureRecognitor PinchGestureRecognitor;
//UIPangestureRecognitor PangestureRecognitor;
UISweepGestureRecognitor SwipRightGestureRecognitor;
UISwipelFestureRecognitor SwipelFestureRecognitor;
ui旋转手势识别器旋转手势识别器;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
碱基。一个元素改变(e);
longPressGestureRecognizer=新的UILongPressGestureRecognizer(()=>Console.WriteLine(“长按”);
pinchGestureRecognizer=新的UIPinchGestureRecognizer(()=>Console.WriteLine(“Pinch”);
//panGestureRecognizer=新的UIPanGestureRecognizer(()=>Console.WriteLine(“Pan”);
SwiperightGestureRecognitzer=新的UISwipeGestureRecognitzer(()=>UpdateRight()){Direction=UISwipeGestureRecognitzerDirection.Right};
swipeLeftGestureRecognizer=新的UISwipeGestureRecognizer(()=>UpdateLeft()){Direction=UISwipeGestureRecognizerDirection.Left};
rotationGestureRecognizer=新的UIRotationGestureRecognizer(()=>Console.WriteLine(“旋转”));
if(e.NewElement==null){
如果(LongPressGestureRecognitor!=null){
这是一个远程测试识别器(LongPressGestureRecognitor);
}
如果(PinchGestureRecognitor!=null){
此.RemoveGestureRecognizer(pinchGestureRecognizer);
}
/*
如果(panGestureRecognizer!=null){
此.RemoveTestureRecognizer(PangTestureRecognizer);
}
*/
if(SwiperightGestureRecognitor!=null){
此.RemoveTestureRecognitor(SwipRightGestureRecognitor);
}
if(swipeLeftGestureRecognizer!=null){
这