WPF应用中控件本身也可以通过实现事件代码实现拖动的处理不过如果我们使用GongSolutions.WPF.DragDrop来处理事情会变得更加简单轻松它支持很多控件的拖动处理如ListBox, ListView, TreeView, DataGrid等源自ItemsControl的控件本文介绍在工作流模块中拖动TreeView和DataGrid列表实现流程顺序的调整处理。PS给大家推荐一个C#开发可以用到的界面组件——DevExpress WPFDevExpress WPF它拥有120个控件和库将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpress新旧版本帮助文档下载欢迎进QQ qun获取169725316使用GongSolutions.WPF.DragDrop控件的GitHub地址https://github.com/punker76/gong-wpf-dragdrop使用GongSolutions.WPF.DragDrop比较简单和其他类似的做法差不多首先在Nugget找到并添加对应的控件引用如下所示。添加完成相关的引用后我们在需要使用的XAML页面中添加对应的命名空间如下代码上所示。xmlns:ddurn:gong-wpf-dragdrop主要使用框架依赖属性dd:DragDrop.IsDragSourceTrue//是否作为拖拽源 dd:DragDrop.IsDropTargetFalse//是否作为投递目标 dd:DragDrop.UseDefaultDragAdornerTrue//使用默认的拖拽装饰器 dd:DragDrop.UseDefaultEffectDataTemplateTrue//使用默认的阴影数据模板 dd:DragDrop.EffectMoveAdornerTemplate//指定移动时的阴影装饰器模板 dd:DragDrop.DropHandler{Binding MyDropHandler}//投下时执行处理器不过我们一般使用其中的三项就可以了如下代码所示是基于MVVM的模型绑定dd:DragDrop.DropHandler{Binding ViewModel} dd:DragDrop.IsDragSourceTrue dd:DragDrop.IsDropTargetTrue如下列表的界面就是设置了拖动的事件处理效果拖动调整后我们直观的提示一下界面即可如下所示。前面我们看到代码中有 dd:DragDrop.DropHandler{Binding ViewModel} 这个视图模型里面就是包含了拖动处理的事件的我们看看它的定义。首先视图模型需要实现接口IDropTarget以便处理拖动后的顺序修改逻辑它的接口定义如下所示。我们的视图模型实现实现IDropTarget接口包含了两个Over和Drop的方法的实现如下代码所示。主要就是后台对拖动的响应以便更新后端的记录顺序我们通过Seq的顺序来调整即可。在DataGrid中实现拖动列表上面介绍的是对于TreeViw控件的处理对于DataGrid的处理方法也是用类似的方式来实现即可。其中它的XAML界面代码如下所示。DataGrid x:Namegrid dd:DragDrop.DropHandler{Binding ViewModel} dd:DragDrop.IsDragSourceTrue dd:DragDrop.IsDropTargetTrue dd:DragDrop.UseDefaultDragAdornerTrue hc:DataGridAttach.ShowRowNumberTrue AutoGenerateColumnsFalse HeadersVisibilityAll IsReadOnlyTrue ItemsSource{Binding ViewModel.Items} MouseDoubleClickDataGrid_MouseDoubleClick RowHeaderWidth60 SelectionChangedDataGrid_SelectionChanged SelectionModeExtended同样我们可以看到的处理方式类似做法后端页面代码也是实现拖动的顺序处理即可视图模型实现实现IDropTarget接口如下是视图模型代码实现。#region 控件拖放处理 void IDropTarget.DragOver(IDropInfo dropInfo) { var sourceItem dropInfo.Data as FormFlowInfo; var targetItem dropInfo.TargetItem as FormFlowInfo; if (sourceItem ! null targetItem ! null)// targetItem.CanAcceptChildren) { dropInfo.DropTargetAdorner DropTargetAdorners.Highlight; dropInfo.Effects DragDropEffects.Copy; } } async void IDropTarget.Drop(IDropInfo dropInfo) { var sourceItem (FormFlowInfo)dropInfo.Data; var targetItem (FormFlowInfo)dropInfo.TargetItem; string dragMenuId sourceItem.Id; string dropMenuId targetItem.Id; try { if (!dragMenuId.IsNullOrEmpty() !dropMenuId.IsNullOrEmpty()) { await BLLFactoryIFormFlowService.Instance.UpdateTwoSeq(dragMenuId, dropMenuId); await GetData(); GrowlUtil.ShowInfo(已调整了步骤顺序); } } catch (Exception ex) { LogTextHelper.Error(ex); GrowlUtil.ShowError(ex.Message); } } #endregion以上就是在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理它在其他各类型列表集合控件中使用都是类似的方式因此比较好用而且实现的效果也比较不错强烈推荐。本文转载自博客园 - 伍华聪