Avalonia DataGrid 不内置行拖拽排序,需手动实现:启用 AllowDrop、监听鼠标事件捕获拖动项、动态计算插入位置并更新 ObservableCollection,同时禁用默认选择避免冲突。
目前 Avalonia 官方 DataGrid(Avalonia.Controls.DataGrid)**不内置行拖拽排序功能**,也没有类似 WPF 中 AllowDrop + PreviewMouseMove + Drop 的开箱即用支持。但可通过事件拦截与手动逻辑实现——关键在于捕获鼠标拖动行为、动态更新数据源顺序,并配合视觉反馈提升体验。
必须先让 DataGrid 及其容器支持拖放交互:
Grid、Border)上设置 AllowDrop="True"
DragOver 和 Drop 事件,用于判断目标位置和执行插入ObservableCollection),否则无法实时刷新 UI不能依赖 DragDrop.DoDragDropAsync(那是用于跨控件/应用拖文件),而是监听鼠标按下+移动组合:
PointerPressed 事件中记录被点击的行索引(通过 e.GetCurrentPoint(dataGrid).Position + dataGrid.GetRowFromPoint(...) 或绑定项定位)_isDragging = true),并保存拖动项的数据对象在 PointerMoved 或 DragOver 中持续判断鼠标当前悬停在哪两行之间:
dataGrid.GetVisualChildren() 或缓存行高度估算),找到最接近的行间隙(例如:Y 落在第 i 行底部与第 i+1 行顶部之间)AdornerLayer 或临时 Border 在该间隙绘制插入指示线(如一条细横线或带箭头的分隔条)在 Drop 或 PointerReleased 时执行最终逻辑:
ObservableCollection.Insert(targetIndex, item)
IColl
ectionView.Refresh() 确保排序/筛选状态一致(如果用了 CollectionViewSource)不复杂但容易忽略:拖动过程中需禁用 DataGrid 默认选择行为(如设置 SelectionMode="None" 或在拖动时临时取消选择),避免视觉冲突和逻辑干扰。
# go
# 拖拽排序
# 事件捕获
# 对象
# 事件
# position
# border
# 鼠标事件
# wpf
# ui
# 拖动
# 鼠标
# 拖放
# 可选
# 拖拽
# 行间
# 那是
# 遍历
# 用了
# 落在
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Win11怎么关闭系统声音_Win11系统提示音静音设置【详解】
作用域操作符会影响性能吗_php静态调用性能分析【教程】
php做exe支持多线程吗_并发处理实现方式【详解】
Python生成器表达式内存优化_惰性计算说明【指导】
如何在Golang中实现并发消息队列消费者_Golang channel消息消费实践
Python列表推导式与字典推导式教程_简化代码高效写法
Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】
Win11关机快捷键是什么_Win11快速关机方法【大全】
电脑的“网络和共享中心”去哪了_Windows 11新版网络设置指南【新手】
Win11怎么激活Windows10_Win11激活Win10系统方法【步骤】
Golang如何实现基本的用户注册_Golang用户注册表单处理示例
Python集合操作技巧_高效去重解析【教程】
如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量
php嵌入式日志记录怎么实现_php将硬件数据写入本地日志文件【指南】
php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】
Python文件和流处理指南_高效读写大体积数据文件
Windows10系统怎么查看防火墙状态_Win10安全中心网络保护
Mac的Time Machine怎么用_Mac系统备份与数据恢复【完整指南】
Win11怎么关闭自动维护 Win11禁用系统自动维护功能【优化】
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
Win10怎样安装Word样式库_Win10安装Word样式教程【步骤】
如何在 Go 同包不同文件中正确引用结构体
如何在Golang中处理云原生事件_使用Event和Notification机制
Mac怎么进行语音输入_Mac听写功能设置与使用【教程】
Win11怎么更改账户头像_Windows 11自定义用户头像图片设置【步骤】
如何在 Django 中安全修改用户密码而不使会话失效
如何使用正则表达式批量替换重复的 *- 模式为固定字符串
LINUX怎么进行文本内容搜索_Linux grep命令正则表达式用法大全【教程】
Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】
Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】
Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧
XML的“混合内容”是什么 怎么用DTD或XSD定义
Win11无法拖拽文件到任务栏怎么办_Win11开启拖放功能修复【方法】
如何在Golang中实现基础配置管理功能_Golang配置文件读取与更新示例
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
C#如何在一个XML文件中查找并替换文本内容
本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】
Win10怎样清理C盘阿里旺旺缓存_Win10清理阿里旺旺缓存步骤【步骤】
如何使用Golang实现多重错误处理_Golangerror组合与判断方法
Win11怎么关闭触控板_Win11笔记本禁用触摸板快捷键
LINUX的SELinux是什么_详解LINUX强制访问控制系统的入门与配置
Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】
Win11如何设置省电模式 Win11开启电池节电功能【优化】
Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】
如何使用Golang读取日志文件_Golang bufio Scanner日志处理示例
Python脚本参数接收_sys与argparse解析【指导】
MAC怎么截图并快速编辑_MAC自带截图快捷键与标注工具使用【方法】
php485函数怎么捕获异常_php485错误处理机制设置技巧【操作】
Win10电脑怎么设置网络名称_Windows10注册表NetworkList修改
2025-12-26
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。