经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理
来源:cnblogs  作者:伍华聪  时间:2023/12/5 12:07:43  对本文有异议

WPF应用中,控件本身也可以通过实现事件代码实现拖动的处理,不过如果我们使用GongSolutions.WPF.DragDrop来处理,事情会变得更加简单轻松,它支持很多控件的拖动处理,如ListBox, ListView, TreeView, DataGrid等源自ItemsControl的控件,本篇随笔介绍在工作流模块中拖动TreeView和DataGrid列表实现流程顺序的调整处理。

1、使用GongSolutions.WPF.DragDrop

控件的GitHub地址:https://github.com/punker76/gong-wpf-dragdrop

使用GongSolutions.WPF.DragDrop比较简单,和其他类似的做法差不多,首先在Nugget找到并添加对应的控件引用,如下所示。

 添加完成相关的引用后,我们在需要使用的XAML页面中添加对应的命名空间,如下代码上所示。

  1. xmlns:dd="urn:gong-wpf-dragdrop"

主要使用框架依赖属性:

  1. dd:DragDrop.IsDragSource="True"//是否作为拖拽源
  2. dd:DragDrop.IsDropTarget="False"//是否作为投递目标
  3. dd:DragDrop.UseDefaultDragAdorner="True"//使用默认的拖拽装饰器
  4. dd:DragDrop.UseDefaultEffectDataTemplate="True"//使用默认的阴影数据模板
  5. dd:DragDrop.EffectMoveAdornerTemplate//指定移动时的阴影装饰器模板
  6. dd:DragDrop.DropHandler="{Binding MyDropHandler}"//投下时执行处理器

不过我们一般使用其中的三项就可以了,如下代码所示,是基于MVVM的模型绑定

  1. dd:DragDrop.DropHandler="{Binding ViewModel}"
  2. dd:DragDrop.IsDragSource="True"
  3. dd:DragDrop.IsDropTarget="True"

如下列表的界面,就是设置了拖动的事件处理效果

拖动调整后,我们直观的提示一下界面即可,如下所示。

 前面我们看到代码中有  dd:DragDrop.DropHandler="{Binding ViewModel}" ,这个视图模型里面就是包含了拖动处理的事件的,我们看看它的定义。

首先视图模型需要实现接口IDropTarget,以便处理拖动后的顺序修改逻辑,它的接口定义如下所示。

我们的视图模型实现实现IDropTarget接口,包含了两个Over和Drop的方法的实现,如下代码所示。

 主要就是后台对拖动的响应,以便更新后端的记录顺序,我们通过Seq的顺序来调整即可。

 

2、在DataGrid中实现拖动列表

上面介绍的是对于TreeViw控件的处理,对于DataGrid的处理方法,也是用类似的方式来实现即可。

其中它的XAML界面代码如下所示。

  1. <DataGrid
  2. x:Name="grid"
  3. dd:DragDrop.DropHandler="{Binding ViewModel}"
  4. dd:DragDrop.IsDragSource="True"
  5. dd:DragDrop.IsDropTarget="True"
  6. dd:DragDrop.UseDefaultDragAdorner="True"
  7. hc:DataGridAttach.ShowRowNumber="True"
  8. AutoGenerateColumns="False"
  9. HeadersVisibility="All"
  10. IsReadOnly="True"
  11. ItemsSource="{Binding ViewModel.Items}"
  12. MouseDoubleClick="DataGrid_MouseDoubleClick"
  13. RowHeaderWidth="60"
  14. SelectionChanged="DataGrid_SelectionChanged"
  15. SelectionMode="Extended">

同样我们可以看到的处理方式类似做法,后端页面代码也是实现拖动的顺序处理即可,视图模型实现实现IDropTarget接口,如下是视图模型代码实现。

  1. #region 控件拖放处理
  2. void IDropTarget.DragOver(IDropInfo dropInfo)
  3. {
  4. var sourceItem = dropInfo.Data as FormFlowInfo;
  5. var targetItem = dropInfo.TargetItem as FormFlowInfo;
  6. if (sourceItem != null && targetItem != null)// && targetItem.CanAcceptChildren)
  7. {
  8. dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
  9. dropInfo.Effects = DragDropEffects.Copy;
  10. }
  11. }
  12. async void IDropTarget.Drop(IDropInfo dropInfo)
  13. {
  14. var sourceItem = (FormFlowInfo)dropInfo.Data;
  15. var targetItem = (FormFlowInfo)dropInfo.TargetItem;
  16. string dragMenuId = sourceItem.Id;
  17. string dropMenuId = targetItem.Id;
  18. try
  19. {
  20. if (!dragMenuId.IsNullOrEmpty() && !dropMenuId.IsNullOrEmpty())
  21. {
  22. await BLLFactory<IFormFlowService>.Instance.UpdateTwoSeq(dragMenuId, dropMenuId);
  23. await GetData();
  24. GrowlUtil.ShowInfo("已调整了步骤顺序");
  25. }
  26. }
  27. catch (Exception ex)
  28. {
  29. LogTextHelper.Error(ex);
  30. GrowlUtil.ShowError(ex.Message);
  31. }
  32. }
  33. #endregion

 

以上就是在WPF应用中使用GongSolutions.WPF.DragDrop实现列表集合控件的拖动处理,它在其他各类型列表集合控件中使用都是类似的方式,因此比较好用,而且实现的效果也比较不错,强烈推荐。

 

原文链接:https://www.cnblogs.com/wuhuacong/p/17876729.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号