WPF TreeView 控件中的拖放功能






4.63/5 (21投票s)
在 WPF TreeView 控件中实现拖放功能
引言
Windows Presentation Foundation (WPF) 是 .NET 3.0 中引入的一项新技术,名为 Avalon,它能够实现 Windows 程序视觉效果的丰富控制、设计和开发。WPF 应用程序既可以在桌面运行,也可以在 Web 浏览器上运行。
WPF 在控件之间的拖放操作中提供了很大的便利。 拖放相关的大部分工作已经完成,你只需要使用它们即可。
Using the Code
要在 WPF TreeView
控件中启用拖放功能,请按照以下步骤操作:
- 将
TreeView
控件的属性AllowDrop="True"
。 - 在
TreeView
控件中声明三个事件,即“MouseDown
”、“MouseMove
”、“DragOver
”和“Drop
”事件。 - 在代码中实现以下事件:
MouseDown
事件private void TreeView_MouseDown (object sender, MouseButtonEventArgs e) { if (e.ChangedButton == MouseButton.Left) { _lastMouseDown = e.GetPosition(tvParameters); } }
当按下任何鼠标按钮时,会发生此事件。 在此事件中,我们首先检查按钮是否按下,然后将鼠标位置保存到变量中(如果按下的是左键)。
MouseMove
事件private void treeView_MouseMove(object sender, MouseEventArgs e) { try { if (e.LeftButton == MouseButtonState.Pressed) { Point currentPosition = e.GetPosition(tvParameters); if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > 10.0) || (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > 10.0)) { draggedItem = (TreeViewItem)tvParameters.SelectedItem; if (draggedItem != null) { DragDropEffects finalDropEffect = DragDrop.DoDragDrop(tvParameters, tvParameters.SelectedValue, DragDropEffects.Move); //Checking target is not null and item is //dragging(moving) if ((finalDropEffect == DragDropEffects.Move) && (_target != null)) { // A Move drop was accepted if (!draggedItem.Header.ToString().Equals (_target.Header.ToString())) { CopyItem(draggedItem, _target); _target = null; draggedItem = null; } } } } } } catch (Exception) { } }
当鼠标移动时,会发生此事件。 首先,我们检查是否按下了左键。 然后检查鼠标移动的距离,如果它移出选定的
treeview
项之外,则检查拖放效果(如果已拖动)并将其拖放到TreeViewItem
(即目标不为null
)上,则将选定的项复制到拖放的项中。 在此事件中,你可以放置所需的treeviewItem
下拉条件。DragOver
事件private void treeView_DragOver(object sender, DragEventArgs e) { try { Point currentPosition = e.GetPosition(tvParameters); if ((Math.Abs(currentPosition.X - _lastMouseDown.X) > 10.0) || (Math.Abs(currentPosition.Y - _lastMouseDown.Y) > 10.0)) { // Verify that this is a valid drop and then store the drop target TreeViewItem item = GetNearestContainer (e.OriginalSource as UIElement); if (CheckDropTarget(draggedItem, item)) { e.Effects = DragDropEffects.Move; } else { e.Effects = DragDropEffects.None; } } e.Handled = true; } catch (Exception) { } }
当对象在拖放目标的边界内被拖动(移动)时,会发生此事件。 在这里,我们检查指针是否靠近
TreeViewItem
,如果靠近,则在其上设置拖放效果。Drop
事件private void treeView_Drop(object sender, DragEventArgs e) { try { e.Effects = DragDropEffects.None; e.Handled = true; // Verify that this is a valid drop and then store the drop target TreeViewItem TargetItem = GetNearestContainer (e.OriginalSource as UIElement); if (TargetItem != null && draggedItem != null ) { _target = TargetItem; e.Effects = DragDropEffects.Move; } } catch (Exception) { } }
当对象被拖放到
drop
目标上时,会发生此事件。 在这里,我们检查是否将拖放的项拖放到TreeViewItem
上。 如果是,则将drop
效果设置为无,并将目标项设置为变量。 然后MouseMove
事件完成拖放操作。
<treeview.itemcontainerstyle>
<style targettype="{x:Type TreeViewItem}">
<EventSetter Event="TreeViewItem.DragOver" Handler="treeView_DragOver"/>
<EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
<EventSetter Event="TreeViewItem.MouseMove" Handler="treeView_MouseMove"/>
<EventSetter Event="TreeViewItem.MouseDown" Handler="treeView_MouseDown"/>
</style>
</treeview.itemcontainerstyle>
关注点
我阅读了许多关于在 WPF 控件中启用拖放操作的文章和博客,最终我能够编写此代码。 我希望它能帮助你在 WPF TreeView
控件中启用拖放操作。
历史
- 2010 年 1 月 29 日:初始发布