如何在.NET Maui中监听Frame的TouchBegin与TouchEnd触摸事件?
监听.NET Maui Frame控件的TouchBegin和TouchEnd事件
.NET Maui未直接提供TouchBegin/TouchEnd事件,但可以通过自定义手势识别器或平台原生事件绑定两种方式实现需求,以下是具体方案:
方法一:自定义触摸手势识别器
通过继承GestureRecognizer扩展触摸逻辑,并针对各平台实现原生触摸事件绑定:
1. 创建自定义手势识别器类
在共享项目中添加:
public class TouchGestureRecognizer : GestureRecognizer { public event EventHandler TouchBegin; public event EventHandler TouchEnd; internal void RaiseTouchBegin(object sender) => TouchBegin?.Invoke(sender, EventArgs.Empty); internal void RaiseTouchEnd(object sender) => TouchEnd?.Invoke(sender, EventArgs.Empty); }
2. 针对各平台实现Handler扩展
Android平台(Platforms/Android)
添加Handler扩展类:
using Android.Views; using Microsoft.Maui.Handlers; public static class FrameTouchHandler { public static void AttachTouchEvents(this FrameHandler handler) { if (handler.PlatformView == null) return; handler.PlatformView.Touch += (sender, e) => { var touchGesture = handler.VisualElement.GestureRecognizers .FirstOrDefault(g => g is TouchGestureRecognizer) as TouchGestureRecognizer; if (touchGesture == null) return; switch (e.Event.Action) { case MotionEventActions.Down: touchGesture.RaiseTouchBegin(handler.VisualElement); break; case MotionEventActions.Up: case MotionEventActions.Cancel: touchGesture.RaiseTouchEnd(handler.VisualElement); break; } }; } }
iOS平台(Platforms/iOS)
添加Handler扩展类:
using UIKit; using Microsoft.Maui.Handlers; public static class FrameTouchHandler { public static void AttachTouchEvents(this FrameHandler handler) { if (handler.PlatformView == null) return; var longPressGesture = new UILongPressGestureRecognizer(gesture => { var touchGesture = handler.VisualElement.GestureRecognizers .FirstOrDefault(g => g is TouchGestureRecognizer) as TouchGestureRecognizer; if (touchGesture == null) return; switch (gesture.State) { case UIGestureRecognizerState.Began: touchGesture.RaiseTouchBegin(handler.VisualElement); break; case UIGestureRecognizerState.Ended: case UIGestureRecognizerState.Cancelled: touchGesture.RaiseTouchEnd(handler.VisualElement); break; } }); longPressGesture.MinimumPressDuration = 0; // 立即触发触摸事件 handler.PlatformView.AddGestureRecognizer(longPressGesture); } }
3. 注册Handler并使用
在MauiProgram.cs中注册平台Handler:
var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureMauiHandlers(handlers => { #if ANDROID handlers.AddHandler<Frame, FrameHandler>(handler => handler.AttachTouchEvents()); #endif #if IOS handlers.AddHandler<Frame, FrameHandler>(handler => handler.AttachTouchEvents()); #endif });
在XAML中绑定手势:
<Frame x:Name="MyFrame"> <Frame.GestureRecognizers> <local:TouchGestureRecognizer TouchBegin="OnTouchBegin" TouchEnd="OnTouchEnd"/> </Frame.GestureRecognizers> <!-- Frame内容 --> </Frame>
后台代码处理事件:
private void OnTouchBegin(object sender, EventArgs e) { // 触摸开始逻辑,例如改变Frame背景色 MyFrame.BackgroundColor = Colors.LightGray; } private void OnTouchEnd(object sender, EventArgs e) { // 触摸结束逻辑 MyFrame.BackgroundColor = Colors.White; }
方法二:直接绑定平台原生事件
如果不需要复用手势逻辑,可直接在代码后台获取原生控件并绑定事件(需在Frame.Loaded事件中执行,确保Handler已初始化):
Android平台
private void MyFrame_Loaded(object sender, EventArgs e) { #if ANDROID var nativeView = MyFrame.Handler.PlatformView as Android.Views.View; nativeView.Touch += (s, args) => { if (args.Event.Action == MotionEventActions.Down) { // TouchBegin逻辑 } else if (args.Event.Action is MotionEventActions.Up or MotionEventActions.Cancel) { // TouchEnd逻辑 } }; #endif }
iOS平台
private void MyFrame_Loaded(object sender, EventArgs e) { #if IOS var nativeView = MyFrame.Handler.PlatformView as UIKit.UIView; var touchGesture = new UIKit.UILongPressGestureRecognizer(gesture => { switch (gesture.State) { case UIKit.UIGestureRecognizerState.Began: // TouchBegin逻辑 break; case UIKit.UIGestureRecognizerState.Ended: case UIKit.UIGestureRecognizerState.Cancelled: // TouchEnd逻辑 break; } }); touchGesture.MinimumPressDuration = 0; nativeView.AddGestureRecognizer(touchGesture); #endif }
内容的提问来源于stack exchange,提问作者infinitezero
相关产品推荐
相关产品推荐

