.NET MAUI拖拽过程中如何获取鼠标/手指位置?
在.NET MAUI拖拽过程中获取鼠标/手指位置的方案
可以实现,虽然MAUI原生的DragEventArgs没有提供直接的GetPosition方法,但通过平台原生事件参数可以提取拖拽位置,以下是具体实现步骤:
1. 添加DropGestureRecognizer并订阅事件
给你的GraphicsView添加拖拽识别器,订阅DragOver(用于实时判断位置)和Drop(处理放置逻辑)事件:
var dropGesture = new DropGestureRecognizer(); dropGesture.DragOver += OnDragOver; dropGesture.Drop += OnDrop; myGraphicsView.GestureRecognizers.Add(dropGesture);
2. 封装跨平台的位置获取方法
通过DragEventArgs.PlatformArgs获取各平台的原生事件对象,转换为相对于目标视图(这里是GraphicsView)的坐标:
private Point GetDragPosition(DragEventArgs e, VisualElement relativeTo) { Point position = Point.Zero; #if ANDROID var dragEvent = e.PlatformArgs.Event as Android.Views.DragEvent; if (dragEvent != null) { var view = relativeTo.Handler.PlatformView as Android.Views.View; var rawX = dragEvent.GetX(); var rawY = dragEvent.GetY(); // 转换为视图相对坐标 int[] location = new int[2]; view.GetLocationOnScreen(location); position = new Point(rawX - location[0], rawY - location[1]); } #elif IOS var dropSession = e.PlatformArgs.Session as UIKit.UIDropSession; if (dropSession != null) { var view = relativeTo.Handler.PlatformView as UIKit.UIView; var nativePoint = dropSession.LocationInView(view); position = new Point(nativePoint.X, nativePoint.Y); } #elif WINDOWS var args = e.PlatformArgs.Event as Microsoft.UI.Xaml.DragEventArgs; if (args != null) { var relativePoint = args.GetPosition(relativeTo.Handler.PlatformView as Microsoft.UI.Xaml.UIElement); position = new Point(relativePoint.X, relativePoint.Y); } #endif return position; }
3. 在事件中判断放置区域
在DragOver或Drop事件中调用上述方法,获取位置后判断是否在允许的区域内,进而控制是否允许放置:
private void OnDragOver(object sender, DragEventArgs e) { var graphicsView = sender as GraphicsView; if (graphicsView == null) return; var position = GetDragPosition(e, graphicsView); // 示例:仅允许在(50,50)-(200,200)区域内放置 bool isInAllowedArea = position.X >= 50 && position.X <= 200 && position.Y >= 50 && position.Y <= 200; // 设置是否接受拖拽操作 e.AcceptedOperation = isInAllowedArea ? DataPackageOperation.Copy : DataPackageOperation.None; } private void OnDrop(object sender, DropEventArgs e) { var graphicsView = sender as GraphicsView; if (graphicsView == null) return; var position = GetDragPosition(e, graphicsView); bool isInAllowedArea = position.X >= 50 && position.X <= 200 && position.Y >= 50 && position.Y <= 200; if (isInAllowedArea) { // 执行你的放置逻辑,比如在GraphicsView的指定位置绘制内容 } }
补充说明
拖拽过程中PointerGestureRecognizer不会触发,是因为系统的拖拽框架会拦截所有指针事件,因此必须通过拖拽事件的平台参数来获取位置信息。
内容的提问来源于stack exchange,提问作者slabrie
相关产品推荐
相关产品推荐

