C# Xamarin UISweepGestureRecognitor渲染器
在Xamarin.Forms中,我希望能够左右滑动以浏览图片列表。目前,我只想在每次检测到刷卡时触发一个事件 要在渲染器中使用的子类: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) {
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){
这