Xamarin.Forms TapEvent为空导致TapGestureRecognizer绑定Command无法触发
问题原因
TapEvent为空:C# 中的事件如果没有任何代码订阅其回调,默认值就是 null。你当前的代码仅定义了TapEvent和触发逻辑,没有任何位置注册该事件的处理方法,因此触发时必然为空。ImageTapCommand无法触发:iOS 自定义 Renderer 中添加的原生UITapGestureRecognizer默认会拦截触摸事件,导致 Xamarin.Forms 层级的TapGestureRecognizer收不到点击响应,绑定的 Command 自然不会执行。
解决方案
你可以根据自己的业务需求选择以下任意一种方案:
方案1:无需保留自定义TapEvent,仅触发绑定的Command
如果你的自定义TapEvent没有其他用途,仅需要触发XAML中绑定的ImageTapCommand,直接修改Renderer代码,关闭原生手势的事件拦截即可:
UITapGestureRecognizer tgr = new UITapGestureRecognizer(TapHandler); // 新增这行,原生手势处理完后不拦截事件,继续传递给Forms层级 tgr.CancelsTouchesInView = false; nativeElement.AddGestureRecognizer(tgr);
修改后可以直接删除TapEvent相关的定义和触发代码,不会再出现空引用问题。
方案2:需要保留自定义TapEvent传递坐标参数
如果你需要通过TapEvent传递点击的X/Y坐标做后续业务处理,按以下步骤修改:
步骤1:避免事件空引用
修改CustomImage中的事件声明,添加默认空订阅,即使没有订阅者也不会为空:
public event EventHandler<CarSchematic.PointEventArgs> TapEvent = delegate { };
步骤2:注册事件回调处理业务逻辑
你可以直接在页面代码中订阅该事件,执行业务逻辑或者触发ViewModel的Command:
// 页面构造函数中添加,假设你的CustomImage的x:Name为CustomImageInstance CustomImageInstance.TapEvent += (sender, args) => { // 可以通过args获取点击的X/Y坐标 // 执行ViewModel中的Command (BindingContext as YourViewModelType).ImageTapCommand.Execute(args); };
步骤3:删除冗余代码
因为已经通过自定义事件处理点击逻辑,可以直接删除XAML中添加的TapGestureRecognizer相关代码,避免重复触发。
内容的提问来源于stack exchange,提问作者newxamarin
相关产品推荐
相关产品推荐

