博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【WPF】 实现Treeview 的拖拽
阅读量:6845 次
发布时间:2019-06-26

本文共 3318 字,大约阅读时间需要 11 分钟。

实现方式有两种。

  方式一:通过重载事件来进行的
     参考项目源码:
     优点:调用到自己的项目中方式简单。随意拖动
     缺点:难以添加限制对于一些节点不能拖动的设置性弱
  方式二:通过写Treeview的事件来进行拖动

     前台:

View Code

    后台:

View Code
private Point _lastMouseDown;        private void tvRequire_MouseDown(object sender, MouseButtonEventArgs e)        {            if (e.ChangedButton == MouseButton.Left)            {                _lastMouseDown = e.GetPosition(tvRequire);            }        } private void tvRequire_MouseMove(object sender, MouseEventArgs e)        {            if (e.LeftButton == MouseButtonState.Pressed)            {                Point currentPosition = e.GetPosition(tvRequire);                if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > 2.0) || (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > 2.0))                {                    if ((tvRequire.SelectedItem as TreeViewItem) != null)                    {                        DragDropEffects finalDropEffect = DragDrop.DoDragDrop(tvRequire.SelectedItem as TreeViewItem, sender, DragDropEffects.Move);                    }                }            }        }private void TheTreeView_CheckDropTarget(object sender, DragEventArgs e)        {                        if (e.Source as TreeViewItem != null)            {                if (!IsValidDropTarget((e.Source as TreeViewItem).Tag))                {                    e.Effects = DragDropEffects.None;                }            }            e.Handled = true;        }//检查是否能够拖        private bool IsValidDropTarget(object id)        {            bool res = false;            if (id != null)            {                                //根据各自需求来写            }            return res;        }  //Drop 进行保存 private void tvRequire_Drop(object sender, DragEventArgs e)        {            TreeViewItem treeViewItemParent = new TreeViewItem();            if (e.Source as EditableTextBlock != null)            {                treeViewItemParent = (e.Source as EditableTextBlock).Parent as TreeViewItem;//().Parent as TreeViewItem                if (tvRequire.SelectedItem as TreeViewItem == (e.Source as EditableTextBlock).Parent as TreeViewItem)                {                    return;                }            }            else            {                treeViewItemParent = e.Source as TreeViewItem;                if (tvRequire.SelectedItem as TreeViewItem == e.Source as TreeViewItem)                {                    return;                }            }            //进行增加删除功能            TreeViewItem itemRemoved = tvRequire.SelectedItem as TreeViewItem;            CusRequireInfo cusRequireInfo = BLLCusRequire.GetModel(Convert.ToInt32(itemRemoved.Tag));            if (cusRequireInfo.ParentId == 0)            {                tvRequire.Items.Remove(itemRemoved);            }            else            {                (itemRemoved.Parent as TreeViewItem).Items.Remove(itemRemoved);            }            (treeViewItemParent).Items.Add(itemRemoved);            cusRequireInfo.ParentId = Convert.ToInt32(treeViewItemParent.Tag);            BLLCusRequire.Update(cusRequireInfo);        }

   PS:主要有三个方法体  tvRequire_MouseDown(开始记录坐标) tvRequire_MouseMove(指定拖动效果操作)TheTreeView_CheckDropTarget(用来检查是否可拖动)  tvRequire_Drop  (用来进行拖动后的保存)

       优点:能够自定义的限制拖拽条件,比较容易理解

       缺点:代码量多,复用率低

  转载请注明出处:

 

转载于:https://www.cnblogs.com/ruicky/archive/2013/01/21/2869206.html

你可能感兴趣的文章
【Linux】linux命令大全
查看>>
Linux busybox mount -a fstab
查看>>
j中的substr(start,length)和substring(start,stop)
查看>>
基于MVC4+EasyUI的Web开发框架形成之旅--总体介绍
查看>>
第 1 章 Developer & Programming language
查看>>
在springmvc中使用hibernate-validate
查看>>
Data Security Is Now More Important Than Ever
查看>>
25.1. 文件
查看>>
Ubuntu 14.04 AM335x TI-RTOS 编译
查看>>
[LeetCode] Print Binary Tree 打印二叉树
查看>>
Android Broadcast Receiver
查看>>
Http状态码详解
查看>>
css属性之appearance
查看>>
js的prototype的详解(1)
查看>>
未来十年医疗健康这5个领域将最赚钱
查看>>
浅谈开源大数据平台的演变
查看>>
MySQL添加字段和修改字段的方法
查看>>
轨迹系列——通过时间及距离维度进行轨迹聚类平滑的一种方案
查看>>
项目管理(一)计时计件
查看>>
自定义控件中使用Render的writer
查看>>