TreeViewItem拖放不会引发DragOver事件

时间:2012-04-20 00:08:49

标签: c# wpf treeview treeviewitem

我目前正在使用附加属性为TreeView实现拖放。长话短说我想使用附加属性来启用/禁用拖放。我已经设法让一切正常,我遇到了一个非常奇怪的问题。我正在监视TreeView.DragOver事件以确定树中我将要插入新项目的位置。我的问题是,当我拖动到TreeViewItem的内容(即边框或​​textBlock)的右侧时,会生成DragOver事件,但DragEventArgs.OriginalSource属性设置为TreeView控件的Grid元素。 Grid或TreeViewItem不应该生成事件吗?

以下是与事件相关的代码片段:

/// Property Changed callback when you set DragDrop attached property
private static void OnDragDropPropertyChanged_(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
    TreeView control = (TreeView)obj;

    if ((bool)args.NewValue == true)
    {
        control.AllowDrop = true;

        ...

        control.DragEnter += OnTreeViewDragEnter_;
        control.DragLeave += OnTreeViewDragLeave_;
        control.DragOver += OnTreeViewDragOver_;
        control.Drop += OnTreeViewDrop_;                
    }
}

我还尝试使用HitTest来确定鼠标位于哪个TreeViewItem上,因为DragDrop似乎停止了所有鼠标事件。

所以基本上我希望使用TreeViewItem的整个右侧作为拖放的放置区域,而不仅仅是托管项目内容的区域。有没有人有什么建议?

1 个答案:

答案 0 :(得分:2)

http://support.microsoft.com/kb/307968

  

ItemDrag:此事件从源TreeView控件引发为   用户开始拖动树节点。发生这种情况时,请致电   用于启动拖放过程的DoDragDrop方法。

因此,您还需要为ItemDrag添加事件处理程序,并在引发其他事件之前调用DoDragDrop。