You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:30:39