實現方式有兩種。
方式一:通過重載事件來進行的
參考項目源碼:http://files.cnblogs.com/ruicky/Wpf-TreeView-%E5%85%A8%E8%83%BD%E5%AE%9E%E7%8E%B0%E6%8B%96%E6%8B%BD.zip
優點:調用到自己的項目中方式簡單。隨意拖動
缺點:難以添加限制對於一些節點不能拖動的設置性弱
方式二:通過寫Treeview的事件來進行拖動
前台:

<TreeView Name="tvRequire" BorderThickness="1" MouseDown="tvRequire_MouseDown" MouseMove="tvRequire_MouseMove" DragEnter="TheTreeView_CheckDropTarget" DragLeave="TheTreeView_CheckDropTarget" DragOver="TheTreeView_CheckDropTarget" Drop="tvRequire_Drop" > </TreeView>
后台:

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 (用來進行拖動后的保存)
優點:能夠自定義的限制拖拽條件,比較容易理解
缺點:代碼量多,復用率低
轉載請注明出處: http://www.cnblogs.com/ruicky/archive/2013/01/21/2869206.html