【发布时间】:2014-03-24 15:11:40
【问题描述】:
我有一个 TreeView 控件,我在其中实现了拖放。 DragOver 处理程序中有代码可以突出显示拖动节点的正确目标节点,效果很好。我用鼠标左键移动一个节点,用右键复制它。问题是使用右键时,TreeView 在拖动操作期间无法正确显示所选节点。正在选择正确的节点,我已经用停止点进行了验证,但是 TreeView 本身没有显示这一点。它确实在使用鼠标左键时显示。
private void DocumentMap_ItemDrag(object sender, ItemDragEventArgs e)
{
// Only handle TreeNode objects
if (e.Item.GetType() != typeof(TreeNode)) return;
this.dragNode = e.Item as TreeNode;
var sourceType = XmlItem.FromElement(this.dragNode.Tag as XElement).ItemType;
if (sourceType == Xml.ProjectHeader || sourceType == Xml.GroupHeader) return;
switch (e.Button)
{
case System.Windows.Forms.MouseButtons.Left:
DoDragDrop(e.Item, DragDropEffects.Move);
break;
case System.Windows.Forms.MouseButtons.Right:
DoDragDrop(e.Item, DragDropEffects.Copy);
break;
}
this.dragNode = null;
}
private void DocumentMap_DragOver(object sender, DragEventArgs e)
{
if (this.dragNode == null) return;
var targetType = XmlItem.FromNode(this.dragNode.Parent).ItemType;
var hoverNode = DocumentMap.GetNodeAt(DocumentMap.PointToClient(new Point(e.X, e.Y)));
var targetNode = FindNodeInAncestors(hoverNode, targetType);
if (targetNode != null && targetNode != this.dragNode.Parent)
DocumentMap.SelectedNode = targetNode;
else
DocumentMap.SelectedNode = null;
}
【问题讨论】:
-
什么都没有跳出来,用鼠标右键D+D没问题。我假设 DragOver 事件处理程序没有运行。看不到 DragEnter,e.Effect 分配很可能是问题所在。注意异常,它们会被 D+D 事件处理程序吞没。
-
这很奇怪。单步执行代码,我看到节点被选中。当 DragDrop 发生时,节点被选中。只要按住鼠标右键,控件就不会在视觉上更新。编辑:我也尝试过使用相同的效果,没有任何变化。